2012-01-21 15 views
5

UITableView'ın reloadData yöntemiyle ilgili bir sorun yaşıyorum. Yeni hücreler eklendiğinde veya alındıktan sonra sadece cellForRowAtIndexPath çağırdığını buldum.UITableView hücresini çağırmak için hücreForRowAtIndexPath: tüm hücreler için

Örnek: Her biri beş dizeyi içeren beş hücreye sahibim. Yeni bir hücre ekler ve reloadData'u çağırırsam, tablo güncellenir ve onu görüyorum. Yine de beş hücreden birine gidersem, yeni bir dize ekleyin, ardından reloadData'u arayın ve çağırın, tablo görünümünün temsilci yöntemlerinden hiçbiri aranmaz.

Soruma Soru: Tablo görünümünü, görülebilir tüm hücrelerindeki verileri tamamen yeniden yüklemeye zorlamak mümkün mü?

cevap

8

Problemi buldum - Hücre kişiselleştirme kodumu if(cell == nil) bloğunda vardı, bu yüzden hücreler geri dönüştürüldükleri için değiştirilmediler. Özelleştirme kodumu o bloktan çıkarmak sorunu çözdü.

+0

Çalışma saatlerimi kurtardın. Teşekkür ederim! Bu aptal hatayı tahmin etmemiştim :) – Pruthvid

+0

Benim çözümüm, başka birine yardım edebilir! –

0

Tablo görünümü yalnızca görünen hücreler üzerinde cellForRowAtIndexPath numaralı telefonu arayacak, ancak reloadData numaralı telefonu arayacaksanız, bunu yapacak başka bir şey olacak ve ne olduğundan emin değilim.

+0

Bu durumda, tüm hücreler görünür. Veri kaynağının (bu örnekte, NSUserDefaults) güncellenmekte olduğunu biliyorum, bu yüzden neden sadece yeni hücrelerin güncellendiğinden emin değilim. –

+0

Arama yapılmadığını kanıtlamak için 'cellForRowAtIndexPath' çağrılarını izlediniz mi, yoksa sadece görsel bir değişiklik görmüyor musunuz? Eğer 'cellForRowAtIndexPath' çağrılmıyorsa ... neler olduğunu bilmiyorum. Bu noktada, bir adım geri gidip 'numberOfRowsInSection' çağrılarını izlerdim. Her durumda, 'reloadData' yaptığınızda her hücre için 'cellForRowAtIndexPath' _should_ çağrılabilir diyebilirim. – smparkes

+0

NSLogs, yeni bir satır eklediğimde her şeyin güncelleneceğini söylüyor; ilk hipotezim yanlıştı. Başka bir görünüm denetleyicisinden tablo görünümüne döndükten sonra reloadData çağrılırken, hiçbir şey çağrılmaz. –

0

Tablo görünümünüzde 50 satır olsa bile, yalnızca tek seferde görülebileceği kadar hücre var. Yeniden kullanıcı arabiriminin arkasındaki bütün hikaye bu. Yani 'tüm hücreler' zorlanmaz. Yeni bir hücre görünürse, veriler dinamik olarak yüklenir.

Bir hücreyi değiştirmenin tek yolu, dataSource method cellForRowAtIndexPath tarafından sağlanan verileri değiştirmektir.

+1

Sorumu cevapsız ettim; Şimdi güncelledim. –

+0

Ve eğer reloadRowsAtIndexPaths deneyin: WithRowAnimation: 'Sadece kontrol etmek ... Bunun çözüm olmak için izin vermeyin. – Jodocus

+0

Bu da işe yaramaz; etkisi yok. –

0

Kodunuzu if (cell == nil) bloğundan çıkarmayın. Bunun yerine, yaptığınız hücre için bir temsilci tanımlayıcı oluşturun; Hücrenin tüm içeriğinin tanımlayıcıda belirtildiğinden emin olun. Örneğin, 3 rakamınız varsa, tanımlayıcıda bu üç sayıyı benzersiz bir şekilde kullandığınızdan ve yalnızca bu tür içeriğe sahip bir hücreye başvurduğundan emin olun.

Sınıfınızda, dizi1, dizi2 ve dizi3'te NSNumber nesnelerinin içine sarılmış int değerlerine sahip üç NSArray özelliğinizin olduğunu varsayalım. Bir UITableView doldurmak için bu NSArrays kullanmak istiyorum, bu ne yaparım geçerli:

- (UITableViewCell *)tableView:(UITableView *)tableView 
        cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSString *identifier = [NSString stringWithFormat:@"%@-%@-%@", 
          [[array1 objectAtIndex:indexPath.row] intValue], 
          [[array2 objectAtIndex:indexPath.row] intValue], 
          [[array3 objectAtIndex:indexPath.row] intValue]]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 

    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] 
            initWithStyle:UITableViewCellStyleDefault 
            reuseIdentifier:identifier] autorelease]; 

     //Build your cell here. 
    } 

    return cell; 
} 
1

Ben bölümleri yeniden daha kolay veri yükler olduğunu tespit ettik. Eğer sadece bir bölümü varsa deneyebilirsiniz:

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

1

Deneyebilirsin bu

[tableView reloadData]; 

veya commitEditingStyle yönteminde bu koymak

[tableView deleteRowsAtIndexPaths:[NSMutableArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade]; 

.

İlgili konular