Mam niestandardowy UITableView
przy użyciu UITableViewCell
s. Każdy UITableViewCell
ma 2 przyciski. Kliknięcie tych przycisków spowoduje zmianę obrazu w UIImageView
komórce.
Czy można odświeżyć każdą komórkę osobno, aby wyświetlić nowy obraz? Każda pomoc jest mile widziana.
objective-c
uitableview
Kreator iOS
źródło
źródło
[NSArray arrayWithObject:]
.beginUpdates
iendUpdates
są zbędne.Próbowałem po prostu zadzwonić
-[UITableView cellForRowAtIndexPath:]
, ale to nie zadziałało. Ale na przykład działa dla mnie następujące. Jaalloc
i za ciasno zarządzanie pamięcią.release
NSArray
- (void)reloadRow0Section0 { NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0]; NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil]; [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone]; [indexPaths release]; }
źródło
Szybki:
func updateCell(path:Int){ let indexPath = NSIndexPath(forRow: path, inSection: 1) tableView.beginUpdates() tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations tableView.endUpdates() }
źródło
reloadRowsAtIndexPaths:
jest w porządku, ale nadal będzie wymuszaćUITableViewDelegate
metody strzelania.Najprostsze podejście, jakie mogę sobie wyobrazić, to:
UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; [self configureCell:cell forIndexPath:indexPath];
To ważne , aby wywołać swoją
configureCell:
realizację na głównym wątku, jak to przyzwyczajenie praca na wątku non-UI (tej samej historii zreloadData
/reloadRowsAtIndexPaths:
). Czasami pomocne może być dodanie:dispatch_async(dispatch_get_main_queue(), ^ { [self configureCell:cell forIndexPath:indexPath]; });
Warto też unikać pracy, która byłaby wykonywana poza aktualnie widocznym widokiem:
BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound; if (cellIsVisible) { .... }
źródło
Jeśli używasz niestandardowych TableViewCells, ogólny
[self.tableView reloadData];
nie odpowie skutecznie na to pytanie, chyba że opuścisz bieżący widok i wrócisz. Pierwsza odpowiedź też nie.
Aby pomyślnie ponownie załadować pierwszą komórkę widoku tabeli bez przełączania widoków , użyj następującego kodu:
//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]; }
Wstaw następującą metodę odświeżania, która wywołuje powyższą metodę, dzięki czemu możesz ponownie załadować tylko górną komórkę (lub cały widok tabeli, jeśli chcesz):
- (void)refresh:(UIRefreshControl *)refreshControl { //call to the method which will perform the function [self reloadTopCell]; //finish refreshing [refreshControl endRefreshing]; }
Teraz, gdy masz już to posortowane, wewnątrz
viewDidLoad
dodaj następujące elementy://refresh table view UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; [refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged]; [self.tableView addSubview:refreshControl];
Masz teraz niestandardową funkcję odświeżania tabeli, która ponownie załaduje górną komórkę. Aby ponownie załadować całą tabelę, dodaj plik
[self.tableView reloadData];
do nowej metody odświeżania.Jeśli chcesz przeładowywać dane za każdym razem, gdy przełączasz widoki, zaimplementuj metodę:
//ensure that it reloads the table view data when switching to this view - (void) viewWillAppear:(BOOL)animated { [self.tableView reloadData]; }
źródło
Swift 3:
źródło
Wystarczy nieznacznie zaktualizować te odpowiedzi za pomocą nowej składni literału w iOS 6 - możesz użyć Paths = @ [indexPath] dla pojedynczego obiektu lub Paths = @ [indexPath1, indexPath2, ...] dla wielu obiektów.
Osobiście odkryłem, że dosłowna składnia tablic i słowników jest niezwykle użyteczna i pozwala zaoszczędzić dużo czasu. Po pierwsze, jest po prostu łatwiejszy do odczytania. I eliminuje potrzebę umieszczania zera na końcu każdej listy wielu obiektów, co zawsze było osobistym błędem. Wszyscy mamy wiatraki, którymi możemy się przechylić, tak? ;-)
Pomyślałem, że dodam to do miksu. Mam nadzieję, że to pomoże.
źródło
Oto rozszerzenie UITableView ze Swift 5:
import UIKit extension UITableView { func updateRow(row: Int, section: Int = 0) { let indexPath = IndexPath(row: row, section: section) self.beginUpdates() self.reloadRows(at: [indexPath as IndexPath], with: UITableView.RowAnimation.automatic) self.endUpdates() } }
Zadzwoń z
self.tableView.updateRow(row: 1)
źródło
Potrzebuję komórki uaktualnienia, ale chcę zamknąć klawiaturę. Jeśli używam
let indexPath = NSIndexPath(forRow: path, inSection: 1) tableView.beginUpdates() tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations tableView.endUpdates()
klawiatura zniknie
źródło