2013-12-10 17 views
7

Benim UITableView hücre koleksiyona sahiptir deleteRowsAtIndexPaths sonra görmezden geldi. Bir hücreyi kaydırmak, bir Kaldır düğmesinin görünmesine neden olur. Bu Kaldır düğmesini dokunulduğunda aşağıdaki kod çalıştırılmasına sebep olur:İlk kademe

NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
[self.itemList removeObjectAtIndex:indexPath.row]; 

Bu doğru hücre listesinden çıkarılmasına sebep olmaktadır. Bunu seçmek için UITableView kalan hücrelerin birinde dokunun Ancak, bu musluk göz ardı edilir (yani tableView: didSelectRowAtIndexPath çağrılmaz). Eğer ikinci kez dokunursam, o zaman doğru çalışır (yani tabloView: didSelectRowAtIndexPath çağrılır).

Ben silme sonra dokunun hangi hücre önemli değil ve ben silme sonra beklemek ne kadar önemli değildir, silme sonra ilk musluk hep göz ardı edilir ve sil sonra ikinci kademe başarılıdır. Çeşitli StackOverflow'daki yanıtlara göre

, ben denedim:

  • silme önce [self.tableView beginUpdates]; ve arama silme
  • sonra [self.tableView reloadSections:indexSet withRowAnimation:UITableViewRowAnimationFade]; arayarak silme
  • sonra [self.tableView reloadData]; arayarak silme
  • sonra self.tableView.editing = NO; ayarı aynı tim Yukarıdakilerin hepsi yapıyor silme
  • sonra [self.tableView endUpdates]; E

yukarıda yardımcı olmuştur hiçbiri; Silme işleminden sonra ilk dokunma hala her zaman göz ardı edilir.

UPDATE: Ayrıca, yukarıdaki kod snippet'ine [self.itemList removeObjectAtIndex:indexPath.row]; kodunu da ekledim. Benim veri kaynağı temsilci yöntemleri şu şekilde görünür:

-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return self.itemList.count; 
} 

üzerinde bir düğme musluk cevaben doDelete yönteminde çağrılan kod parçacığı ([self.deleteButton addTarget:self action:@selector(doDelete) forControlEvents:UIControlEventTouchUpInside];)

GÜNCELLEME # 2: lyssa yorumlarına dayanarak, aşağıdaki denedim: Ben tüm özel başvurular Sil düğmesine ve hızlıca kaydırma hareketini kaldırıldı ve sonra bizim UITableView temsilci bu kodu eklendi:

-(BOOL) tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { 
    return YES; 
} 

-(void) tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     [self.itemList removeObjectAtIndex:indexPath.row]; 
     [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft]; 
    } 
} 

işi yok - Şimdi satırları silebilir ve sonraki musluk düzgün çalışıyor. Ancak, bu, özel kodumuzun amacı olan tablo hücremize özel görünüm ve izlenimi kaldırır. Belki de yukarıdaki yöntemleri kullanarak ve bunun yerine Sil düğmesini özelleştirmeliyim (biraz baktım ve henüz iyi bir cevap bulamadım).

+0

Hücreyi kaldırdıktan sonra, numberOfRowsInSection: sayımını azaltır mısınız? – Greg

+0

, tablo görünümünüzün veri kaynağını güncellediniz mi, silinen hücrenin veri nesnesini kaldırdınız mı? – thorb65

+0

deleteRowsAtIndexPath'i nereye koydunuz? – asjj

cevap

0

Teşekkür ayarlayarak bunu çözebilir. Yorumlarınız, sorunu takip etmeme yardımcı oldu.

tableView:shouldHighlightRowAtIndexPath'u uyguladık ve bir silme işleminden sonra ilk çağrı için NO döndürüyor ve ardından YES'i tekrar döndürüyoruz. İlk musluğun göz ardı edilmesinin nedeni budur. Bizim tam kusurlu kodu olan bu: Bu kod bir kez teşhir edilmesine birden fazla sil düğmesine önlemek için sağlandı, ama biz bir silme sonra düzgün self.currentPath sıfırlamayı değildi

-(BOOL) tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (self.currentPath) { 
     [self resetSelectedCell]; 
     self.currentPath = nil; 
     return NO; 
    } 
    return YES; 
} 

. Artık başarılı bir silme işleminden sonra self.currentPath'i sıfırlayacak ve kod doğru şekilde çalışıyor.

4

sorun kullandığınızda tokatlamak sadece satır düzenleme moduna girer tokatlamak-to-sil olmasıdır.

Ve ilk kademe o satırın düzenleme moduna sona eriyor:

- (void)tableView:(UITableView *)tableView didEndEditingRowAtIndexPath:(NSIndexPath *)indexPath { 
} 

düzenleme modunu soruma cevap veya yorum sağlanan herkese

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (editingStyle == UITableViewCellEditingStyleDelete) { 
     [self.itemList removeObjectAtIndex:indexPath.row]; 
     [self.tableView setEditing:NO animated:YES]; 
    } 
    [self.tableView reloadData]; 
} 
+0

[belgeler] 'den (https://developer.apple.com/library/ios/documentation/UIKit/Reference/UITableViewDataSource_Protocol/index.html#//apple_ref/occ/intfm/UITableViewDataSource/tableView:commitEditingStyle:forRowAtIndexPath nedeniyle aşağı çekilme:): "SetEditing: animated:" ifadesini bu yöntemin bir uygulamasında kullanmamalısınız. Eğer bir sebepten ötürü 'performSelector: withObject: afterDelay:' yöntemini kullanarak bir gecikmeden sonra çağırmalısınız. – Shebuka