Aracılığıyla paylaş


Xamarin.iOS ile Tabloları Düzenleme

Tablo düzenleme özellikleri, bir UITableViewSource alt sınıftaki yöntemler geçersiz kılınarak etkinleştirilir. En basit düzenleme davranışı, tek bir yöntem geçersiz kılma ile uygulanabilen silme hareketidir. Tablo düzenleme modunda daha karmaşık düzenleme (satırları taşıma dahil) yapılabilir.

Silmek için çekin

Silmek için çekme özelliği, iOS'ta kullanıcıların beklediği doğal bir harekettir.

Silmek için Çekme Örneği

Bir hücrede Sil düğmesini göstermek için çekme hareketini etkileyen üç yöntem geçersiz kılma işlemi vardır:

  • CommitEditingStyle – Tablo kaynağı bu yöntemin geçersiz kılınıp kılınmadığını algılar ve çekme-silme hareketini otomatik olarak etkinleştirir. Yöntemin uygulaması, hücrelerin kaybolmasına neden olmak için öğesini UITableView çağırmalı DeleteRows ve ayrıca modelinizdeki temel verileri (dizi, sözlük veya veritabanı gibi) kaldırmalıdır.
  • CanEditRow – CommitEditingStyle geçersiz kılınırsa, tüm satırların düzenlenebilir olduğu varsayılır. Bu yöntem uygulanırsa ve false döndürürse (bazı belirli satırlar için veya tüm satırlar için) o hücrede çekme-silme hareketi kullanılamaz.
  • TitleForDeleteConfirmation – İsteğe bağlı olarak Sil düğmesinin metnini belirtir. Bu yöntem uygulanmazsa düğme metni "Sil" olur.

Bu yöntemler aşağıdaki sınıfta uygulanır TableSource :

public override void CommitEditingStyle (UITableView tableView, UITableViewCellEditingStyle editingStyle, Foundation.NSIndexPath indexPath)
{
    switch (editingStyle) {
        case UITableViewCellEditingStyle.Delete:
            // remove the item from the underlying data source
            tableItems.RemoveAt(indexPath.Row);
            // delete the row from the table
            tableView.DeleteRows (new NSIndexPath[] { indexPath }, UITableViewRowAnimation.Fade);
            break;
        case UITableViewCellEditingStyle.None:
            Console.WriteLine ("CommitEditingStyle:None called");
            break;
    }
}
public override bool CanEditRow (UITableView tableView, NSIndexPath indexPath)
{
    return true; // return false if you wish to disable editing for a specific indexPath or for all rows
}
public override string TitleForDeleteConfirmation (UITableView tableView, NSIndexPath indexPath)
{   // Optional - default text is 'Delete'
    return "Trash (" + tableItems[indexPath.Row].SubHeading + ")";
}

Bu örnekte, koleksiyondan UITableViewSource öğe eklemeyi ve silmeyi desteklediğinden veri kaynağı olarak bir (dize dizisi yerine) kullanacak List<TableItem> şekilde güncelleştirildi.

Düzenleme modu

Tablo düzenleme modundayken, kullanıcı her satırda kırmızı bir 'durdur' pencere öğesi görür ve bu pencere öğesi dokunulduğunda Sil düğmesini gösterir. Tabloda ayrıca sırayı değiştirmek için satırın sürüklenebileceğini belirten bir 'tanıtıcı' simgesi görüntülenir. TableEditMode örneği bu özellikleri gösterildiği gibi uygular.

TableEditMode örneği bu özellikleri gösterildiği gibi uygular

Tablonun düzenleme modu davranışını etkileyen birkaç farklı yöntem UITableViewSource vardır:

  • CanEditRow – her satırın düzenlenip düzenlenemeyeceği. Düzenleme modundayken hem çekme-silme hem de silmeyi önlemek için false döndür.
  • CanMoveRow – taşımayı etkinleştirmek için true veya taşımayı önlemek için false döndür.
  • EditingStyleForRow – tablo düzenleme modundayken, bu yöntemden döndürülen değer hücrenin kırmızı silme simgesini mi yoksa yeşil ekleme simgesini mi görüntüleyeceğini belirler. Satırın düzenlenebilir olmaması gerekiyorsa döndür UITableViewCellEditingStyle.None .
  • MoveRow : Bir satır taşındığında çağrılır, böylece temel alınan veri yapısı tabloda görüntülenen verilerle eşleşecek şekilde değiştirilebilir.

İlk üç yöntem için uygulama oldukça düzdür– belirli satırların davranışını değiştirmek için kullanmak indexPath istemiyorsanız, tablonun tamamı için dönüş değerlerini sabit kodlamanız gerekir.

public override bool CanEditRow (UITableView tableView, NSIndexPath indexPath)
{
    return true; // return false if you wish to disable editing for a specific indexPath or for all rows
}
public override bool CanMoveRow (UITableView tableView, NSIndexPath indexPath)
{
    return true; // return false if you don't allow re-ordering
}
public override UITableViewCellEditingStyle EditingStyleForRow (UITableView tableView, NSIndexPath indexPath)
{
    return UITableViewCellEditingStyle.Delete; // this example doesn't support Insert
}

Temel MoveRow alınan veri yapısını yeni düzenle eşleşecek şekilde değiştirmesi gerektiğinden uygulama biraz daha karmaşıktır. Veriler aşağıdaki kod olarak List uygulandığından, veri öğesini eski konumunda siler ve yeni konuma ekler. Veriler bir SQLite veritabanı tablosunda 'order' sütunuyla (örneğin) depolanmışsa, bu yöntemin bu sütundaki sayıları yeniden sıralamak için bazı SQL işlemleri gerçekleştirmesi gerekir.

public override void MoveRow (UITableView tableView, NSIndexPath sourceIndexPath, NSIndexPath destinationIndexPath)
{
    var item = tableItems[sourceIndexPath.Row];
    var deleteAt = sourceIndexPath.Row;
    var insertAt = destinationIndexPath.Row;

    // are we inserting
    if (destinationIndexPath.Row < sourceIndexPath.Row) {
        // add one to where we delete, because we're increasing the index by inserting
        deleteAt += 1;
    } else {
        // add one to where we insert, because we haven't deleted the original yet
        insertAt += 1;
    }
    tableItems.Insert (insertAt, item);
    tableItems.RemoveAt (deleteAt);
}

Son olarak, tabloyu düzenleme moduna almak için Düzenle düğmesinin şu şekilde çağırması SetEditing gerekir

table.SetEditing (true, true);

ve kullanıcı düzenlemeyi bitirdiğinde Bitti düğmesi düzenleme modunu kapatmalıdır:

table.SetEditing (false, true);

Satır Ekleme Düzenleme Stili

Tablonun içinden satır ekleme yaygın olmayan bir kullanıcı arabirimidir; standart iOS uygulamalarında ana örnek, Kişiyi Düzenle ekranıdır. Bu ekran görüntüsü, satır ekleme işlevinin nasıl çalıştığını gösterir. Düzenleme modunda verilere ek satırlar ekleyen (tıklandığında) başka satırlar vardır. Düzenleme tamamlandığında geçici (yeni ekle) satırı kaldırılır.

Düzenleme tamamlandığında, geçici yeni ekleme satırı kaldırılır

Tablonun UITableViewSource düzenleme modu davranışını etkileyen bir dizi farklı yöntem vardır. Bu yöntemler örnek kodda aşağıdaki gibi uygulanmıştır:

  • EditingStyleForRow – veri içeren satırları döndürür UITableViewCellEditingStyle.Delete ve son satır için döndürür UITableViewCellEditingStyle.Insert (özellikle ekleme düğmesi olarak davranacak şekilde eklenir).
  • CustomizeMoveTarget – Kullanıcı bir hücreyi taşırken bu isteğe bağlı yöntemden döndürülen değer, konum seçimini geçersiz kılabilir. Bu, belirli konumlarda hücreyi 'bırakmalarını' önleyebileceğiniz anlamına gelir; örneğin, herhangi bir satırın (yeni ekle) satırdan sonra taşınmasını engelleyen bu örnek.
  • CanMoveRow – taşımayı etkinleştirmek için true veya taşımayı önlemek için false döndür. Örnekte, yalnızca ekleme düğmesi olarak sunucuya yönelik olduğundan son satırda 'tanıtıcı' taşıması gizlidir.

Ayrıca , 'insert' satırını eklemek ve artık gerekli olmadığında yeniden kaldırmak için iki özel yöntem ekleriz. Bunlar Düzenle ve Bitti düğmelerinden çağrılır:

  • WillBeginTableEditing – Düzenle düğmesine dokunulduğunda, tabloyu düzenleme moduna almak için çağrı yaparSetEditing. Bu, tablonun sonundaki (yeni ekle) satırını görüntüleyerek 'ekle düğmesi' olarak hareket ettiğimiz WillBeginTableEditing yöntemini tetikler.
  • DidFinishTableEditing – Bitti düğmesine dokunulduğunda SetEditing düzenleme modunu kapatmak için yeniden çağrılır. Örnek kod, düzenleme artık gerekli olmadığında tablodan (yeni ekle) satırı kaldırır.

Bu yöntem geçersiz kılmaları TableEditModeAdd/Code/TableSource.cs örnek dosyasında uygulanır:

public override UITableViewCellEditingStyle EditingStyleForRow (UITableView tableView, NSIndexPath indexPath)
{
    if (tableView.Editing) {
        if (indexPath.Row == tableView.NumberOfRowsInSection (0) - 1)
            return UITableViewCellEditingStyle.Insert;
        else
            return UITableViewCellEditingStyle.Delete;
    } else // not in editing mode, enable swipe-to-delete for all rows
        return UITableViewCellEditingStyle.Delete;
}
public override NSIndexPath CustomizeMoveTarget (UITableView tableView, NSIndexPath sourceIndexPath, NSIndexPath proposedIndexPath)
{
    var numRows = tableView.NumberOfRowsInSection (0) - 1; // less the (add new) one
    if (proposedIndexPath.Row >= numRows)
        return NSIndexPath.FromRowSection(numRows - 1, 0);
    else
        return proposedIndexPath;
}
public override bool CanMoveRow (UITableView tableView, NSIndexPath indexPath)
{
    return indexPath.Row < tableView.NumberOfRowsInSection (0) - 1;
}

Bu iki özel yöntem, tablonun düzenleme modu etkinleştirildiğinde veya devre dışı bırakıldığında (yeni ekle) satırı eklemek ve kaldırmak için kullanılır:

public void WillBeginTableEditing (UITableView tableView)
{
    tableView.BeginUpdates ();
    // insert the 'ADD NEW' row at the end of table display
    tableView.InsertRows (new NSIndexPath[] {
            NSIndexPath.FromRowSection (tableView.NumberOfRowsInSection (0), 0)
        }, UITableViewRowAnimation.Fade);
    // create a new item and add it to our underlying data (it is not intended to be permanent)
    tableItems.Add (new TableItem ("(add new)"));
    tableView.EndUpdates (); // applies the changes
}
public void DidFinishTableEditing (UITableView tableView)
{
    tableView.BeginUpdates ();
    // remove our 'ADD NEW' row from the underlying data
    tableItems.RemoveAt ((int)tableView.NumberOfRowsInSection (0) - 1); // zero based :)
    // remove the row from the table display
    tableView.DeleteRows (new NSIndexPath[] { NSIndexPath.FromRowSection (tableView.NumberOfRowsInSection (0) - 1, 0) }, UITableViewRowAnimation.Fade);
    tableView.EndUpdates (); // applies the changes
}

Son olarak, bu kod düzenleme modunu etkinleştiren veya devre dışı bırakan lambdalar ile Düzenle ve Bitti düğmelerini oluşturur:

done = new UIBarButtonItem(UIBarButtonSystemItem.Done, (s,e)=>{
    table.SetEditing (false, true);
    NavigationItem.RightBarButtonItem = edit;
    tableSource.DidFinishTableEditing(table);
});
edit = new UIBarButtonItem(UIBarButtonSystemItem.Edit, (s,e)=>{
    if (table.Editing)
        table.SetEditing (false, true); // if we've half-swiped a row
    tableSource.WillBeginTableEditing(table);
    table.SetEditing (true, true);
    NavigationItem.LeftBarButtonItem = null;
    NavigationItem.RightBarButtonItem = done;
});

Bu satır ekleme kullanıcı arabirimi düzeni çok sık kullanılmaz, ancak herhangi bir tablodaki UITableView.BeginUpdates hücrelerin eklenmesine veya kaldırılmasına animasyon eklemek için ve EndUpdates yöntemlerini de kullanabilirsiniz. Bu yöntemleri kullanma kuralı, ve çağrıları arasında tarafından RowsInSection döndürülen değer farkının ve DeleteRowsEndUpdates yöntemleriyle eklenen/silinen hücrelerin net sayısıyla InsertRows eşleşmesi gerektiğidir.BeginUpdates Temel alınan veri kaynağı, tablo görünümündeki ekleme/silme işlemleriyle eşleşecek şekilde değiştirilmezse bir hata oluşur.