Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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.
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ıDeleteRowsve 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.
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.
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.Deleteve son satır için döndürürUITableViewCellEditingStyle.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ı yapar
SetEditing. 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
SetEditingdü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.


