Am un custom UITableView "folosind" UITableViewCell lui. Fiecare
UITableViewCellare 2 butoane. Făcând clic pe aceste butoane se va schimba o imagine într-un
UIImageView în celulă.
Este posibil pentru a actualiza fiecare celulă separat pentru a afișa noua imagine? Orice ajutor este apreciat.
Odată ce ați indexPath de mobil, puteți face ceva de genul:
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPathOfYourCell, nil] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
În Xcode 4.6 și mai mare:
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPathOfYourCell] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
Puteți seta orice ca dumneavoastră, ca efect de animație, desigur.
Am încercat sunat -[UITableView cellForRowAtIndexPath:]
, dar asta nu't de lucru. Dar, la urma lucrează pentru mine de exemplu. Am `alloc " și "eliberare" a " NSArray pentru strans de management al memoriei.
- (void)reloadRow0Section0 {
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
NSArray *indexPaths = [[NSArray alloc] initWithObjects:indexPath, nil];
[self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationNone];
[indexPaths release];
}
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()
}
reloadRowsAtIndexPaths:
este bine, dar încă va forța UITableViewDelegate
metode de foc.
Cea mai simplă abordare îmi pot imagina este:
UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];
[self configureCell:cell forIndexPath:indexPath];
L's important pentru a invoca configureCell: punerea în aplicare pe firul principal, ca **obiceiul de lucru pe non-UI fir** (aceeasi poveste cu
reloadData/
reloadRowsAtIndexPaths:`). Uneori, ar putea fi util pentru a adăuga:
dispatch_async(dispatch_get_main_queue(), ^
{
[self configureCell:cell forIndexPath:indexPath];
});
L's, de asemenea, merită să evite munca asta ar fi de facut in afara de cele vizibile în prezent vedere:
BOOL cellIsVisible = [[self.tableView indexPathsForVisibleRows] indexOfObject:indexPath] != NSNotFound;
if (cellIsVisible)
{
....
}
Dacă utilizați personalizat TableViewCells, generic
[self.tableView reloadData];
nu este eficientă pentru a răspunde la această întrebare dacă nu vă lăsați vizualizarea curentă și să vină înapoi. Nici primul răspuns.
Cu succes a reîncărca prima vedere masă de celule fără a comuta vizualizări, utilizați următorul cod:
//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];
}
Introduceți următoarele actualizare metode care apelurile la metoda de mai sus, astfel încât să puteți personalizat reîncărca doar partea de sus celulă (sau întregul tabel, dacă doriți):
- (void)refresh:(UIRefreshControl *)refreshControl {
//call to the method which will perform the function
[self reloadTopCell];
//finish refreshing
[refreshControl endRefreshing];
}
Acum că te-am lămurit, în interiorul tău `viewDidLoad adaugă următoarele:
//refresh table view
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
[self.tableView addSubview:refreshControl];
Acum aveți o reîmprospătare personalizat de masă, facilitate care va reîncărca mobil de top. Pentru a reîncărca întregul tabel, se adauga
[self.tableView reloadData];
pentru noua ta metoda refresh.
Dacă doriți să reîncărcați datele de fiecare dată când comutați de vedere, punerea în aplicare a metodei:
//ensure that it reloads the table view data when switching to this view
- (void) viewWillAppear:(BOOL)animated {
[self.tableView reloadData];
}
Doar pentru a actualiza aceste răspunsuri ușor cu noul literal sintaxă în iOS 6-puteți utiliza Căi = @[indexPath] pentru un singur obiect, sau Căi = @[indexPath1, indexPath2,...] pentru mai multe obiecte.
Personal, am'am găsit literal sintaxa pentru tablouri și dicționare pentru a fi extrem de utile și de mare economisesc timp. L's doar mai ușor de citit, pentru un singur lucru. Și aceasta elimină necesitatea pentru un zero la sfârșitul de orice multi-obiect listă, care a fost întotdeauna un caracter personal gogoriță. Toți avem morile de vânt pentru a înclina cu, da? ;-)
Doar crezut că am'd arunca asta în amestec. Sper că vă ajută.
Am nevoie de upgrade-ul mobil, dar vreau închide tastatura. Dacă am folosi
let indexPath = NSIndexPath(forRow: path, inSection: 1)
tableView.beginUpdates()
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic) //try other animations
tableView.endUpdates()
tastatura dispar
Aici este un UITableView extensie cu 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()
}
}
Apel cu
self.tableView.updateRow(row: 1)