Soru UITableView'da tek bir UITableViewCell yenilemek mümkün mü?


Bir özel var UITableView kullanma UITableViewCells. Her UITableViewCell 2 düğmeli. Bu düğmelere tıkladığınızda, UIImageView hücre içinde.

Yeni görüntüyü göstermek için her bir hücreyi ayrı ayrı yenilemek mümkün mü? Herhangi bir yardım takdir edilir.


167
2017-12-15 09:14


Menşei




Cevaplar:


Hücrenin indexPath'ına sahip olduğunuzda, aşağıdaki gibi bir şey yapabilirsiniz:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

Xcode 4.6 ve üstü sürümlerde:

[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates]; 

Animasyon efekti olarak neyi ayarlayabilirsin, elbette.


305
2017-12-15 09:23



Burada nitelendiriliyor, ama tabiki sadece tek bir hücreyi yeniliyor olsaydınız muhtemelen kullanmak isteyeceksiniz [NSArray arrayWithObject:] yerine. - Leo Cassarani
Ayrıca, bu durumda, beginUpdates ve endUpdates gereksizdir. - kubi
OP hiçbir şeyi hareketlendirmiyor, bu yüzden başlangıç ​​/ bitişleri aramaya gerek yok. - kubi
Yöntem söylenmediği sürece kullanımdan kaldırıldı son genel Xcode sürümünde, tüm iOS sürümleri iyi olmalıdır. - Alejandro Iván
@Supertecnoboff true, ama bir noktada onun yerini alabilir veya davranışını değiştirir. En kısa zamanda kullanımdan kaldırılmaları ele almak daha iyi - Alejandro Iván


Sadece aramayı denedim -[UITableView cellForRowAtIndexPath:]ama bu işe yaramadı. Ama, örneğin benim için aşağıdaki işler. ben alloc ve release  NSArray sıkı bellek yönetimi için.

- (void)reloadRow0Section0 {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
    [indexPaths release];
}

32
2018-05-06 04:16



[İndexPaths release] burada gerekli mi? Sadece gerekli olan şeyi kendin tahsis ettiysen diye düşündüm. - powerj1984
İndexPaths dizisini ayırdı. Ancak daha iyi soru, "sıkı bellek yönetiminin" gerekli olduğunu düşünüyor. Autorelease, işi burada mükemmel bir şekilde yapacak. - John Cromartie


Swift:

func updateCell(path:Int){
    let indexPath = NSIndexPath(forRow: path, inSection: 1)

    tableView.beginUpdates()
    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
    tableView.endUpdates()
}

18
2017-11-20 16:51





reloadRowsAtIndexPaths: iyi, ama yine de zorlayacak UITableViewDelegate ateş etme yöntemleri.

Hayal edebileceğim en basit yaklaşım:

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
[self configureCell:cell forIndexPath:indexPath];

Onun önemli çağırmak configureCell: ana iş parçacığı üzerinde uygulama UI olmayan iş parçacığında çalışmayacak (aynı hikaye ile reloadData/reloadRowsAtIndexPaths:). Bazen eklemek yararlı olabilir:

dispatch_async(dispatch_get_main_queue(), ^
{
    [self configureCell:cell forIndexPath:indexPath];
});

Ayrıca şu anda görülebilir görünümün dışında yapılacak işlerden kaçınmaya da değer:

BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound;
if (cellIsVisible)
{
    ....
}

18
2018-01-20 15:13



Neden delege çağırılmak istemiyorsun? - kernix
Bu tablo, reloadRowsAtIndexPaths: veya reloadData yöntemlerinin aksine, tablo görünümünü en üste kaydırmaya zorlamadığından en iyi yaklaşımdır. - ZviBar
Bunu yaptım ve hücrenin geri dönüştürüldüğü gerçeğine kapılarak sona erdi - Travelling Man


Özel TableViewCells kullanıyorsanız, genel

[self.tableView reloadData];    

bu soruya etkili bir şekilde cevap vermiyor mevcut görünümü terk etmedikçe ve geri gel. İlk cevap da yok.

İlk tablo görüntüleme hücrenizi başarıyla yüklemek için görünüm değiştirmedenaşağıdaki kodu kullanın:

//For iOS 5 and later
- (void)reloadTopCell {
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
    NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
}

Aşağıdakileri yerleştirin yenileme yöntemi yukarıdaki yönteme çağrı yapar, böylece yalnızca üst hücreyi (ya da isterseniz tüm tablo görünümünü) yeniden yükleyebilirsiniz:

- (void)refresh:(UIRefreshControl *)refreshControl {
    //call to the method which will perform the function
    [self reloadTopCell];

    //finish refreshing 
    [refreshControl endRefreshing];
}

Şimdi sıraladığın, senin için viewDidLoad aşağıdakileri ekleyin:

//refresh table view
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];

[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];

[self.tableView addSubview:refreshControl];

Artık en üstteki hücreyi yeniden yükleyecek bir özel yenileme tablosu özelliğiniz var. Tüm tabloyu yeniden yüklemek için

[self.tableView reloadData]; yeni yenileme yönteminize.

Verileri her değiştirdiğinizde verileri yeniden yüklemek isterseniz, yöntemi uygulayın:

//ensure that it reloads the table view data when switching to this view
- (void) viewWillAppear:(BOOL)animated {
    [self.tableView reloadData];
}

15
2017-10-13 02:03





Hızlı 3:

tableView.beginUpdates()
tableView.reloadRows(at: [indexPath], with: .automatic)
tableView.endUpdates()

6
2018-01-23 12:43





Sadece bu yanıtları iOS 6'daki yeni gerçek sözdizimi ile biraz güncellemek için - tek bir nesne için Paths = @ [indexPath] veya birden çok nesne için Paths = @ [indexPath1, indexPath2, ...] kullanabilirsiniz.

Şahsen, diziler ve sözlükler için tam anlamıyla yararlı ve büyük zaman tasarrufu sağlayan sözdizimsel sözdizimini buldum. Bir şey için okumak daha kolay. Ve her zaman kişisel bir bugaboo olan herhangi bir çok-nesne listesinin sonunda bir nil ihtiyacını ortadan kaldırır. Hepimiz yel değirmenlerimizi eğmek zorundayız, evet? ;-)

Sadece bunu miksata atabileceğimi düşündüm. Umarım yardımcı olur.


4
2018-01-20 20:03



Greg, aslında o sözdiziminin bir örneği nedir, lütfen? Teşekkürler! - Fattie


Yükseltme hücresine ihtiyacım var ama klavyeyi kapatmak istiyorum. Kullanırsam

let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()

klavye kayboluyor


0
2017-08-04 20:05