2010-12-15 4 views

Antwort

297

Sobald Sie die indexPath Ihrer Zelle haben, können Sie so etwas wie:

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

In Xcode 4.6 und höher:

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

Sie können unabhängig von Ihrem wie als Animationseffekt eingestellt, von Kurs.

+4

Erbsenzählerei verschwinden hier verwenden, aber natürlich, wenn Sie waren nur eine einzelne Zelle erfrischende Sie wahrscheinlich verwenden wollen würde '[NSArray arrayWithObject:]' statt. –

+49

Auch in dieser Situation sind die 'beginUpdates' und' endUpdates' nicht notwendig. – kubi

+0

@kubi Hallo, können Sie erklären, warum sie nicht notwendig sind? – Unheilig

31

Ich versuchte nur -[UITableView cellForRowAtIndexPath:], aber das hat nicht funktioniert. Aber Folgendes funktioniert für mich zum Beispiel. I alloc und release die NSArray für enge Speicherverwaltung.

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

Ist [indexPaths release] hier notwendig? Ich dachte, du brauchst das nur, wenn du das Objekt selbst zugewiesen hast. – powerj1984

+3

Er hat das Array indexPaths zugewiesen. Aber die bessere Frage ist, warum er "straffes Speichermanagement" für notwendig hält. Autorelease wird die Arbeit hier perfekt machen. –

4

Gerade diese Antworten etwas mit dem neuen Literalsyntax in iOS 6 aktualisieren - Sie Paths = verwenden können @ [indexPath] für ein einzelnes Objekt oder Paths = @ [indexPath1, indexPath2, ...] für mehrere Objekte.

Persönlich habe ich die literale Syntax für Arrays und Wörterbücher als immens nützlich und große Zeit Sparer gefunden. Es ist einfach einfacher zu lesen, zum einen. Und es beseitigt die Notwendigkeit für eine Null am Ende einer Multi-Objekt-Liste, die immer eine persönliche Bugaboo war. Wir alle haben unsere Windmühlen zum Kippen, ja? ;-)

Nur gedacht, ich würde das in die Mischung werfen. Ich hoffe es hilft.

+0

Sag Greg, was ist eigentlich ein Beispiel für diese Syntax, bitte? Vielen Dank! – Fattie

15

Wenn Sie benutzerdefinierten TableViewCells verwenden, die generischen

[self.tableView reloadData];  

nicht effektiv diese Frage beantworten , wenn Sie die aktuelle Ansicht und wieder verlassen. Die erste Antwort gibt es auch nicht.

Um erfolgreich zu laden Sie Ihre erste Tabellenansicht Zelle ohne Ansichten zu wechseln, verwenden Sie folgenden Code:

//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]; 
} 

Fügen Sie den folgenden Aktualisierungsmethode, die auf die obige Methode aufruft, so dass Sie benutzerdefinierte nur nachladen können die Top-Zelle (oder die gesamte Tabelle Ansicht, wenn Sie möchten):

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

    //finish refreshing 
    [refreshControl endRefreshing]; 
} 

Nun, da Sie, dass sortiert, innerhalb Ihrer viewDidLoad add die folgenden:

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

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

[self.tableView addSubview:refreshControl]; 

Sie verfügen nun über eine benutzerdefinierte Aktualisierungstabelle, die die oberste Zelle neu lädt. Um die gesamte Tabelle neu zu laden, fügen Sie die

[self.tableView reloadData]; zu Ihrer neuen Aktualisierungsmethode hinzu.

Wenn Sie die Daten erneut zu laden jedes Mal, wenn Sie Ansichten wechseln, implementieren die Methode:

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

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

reloadRowsAtIndexPaths: in Ordnung ist, aber immer noch UITableViewDelegate Methoden zwingen, zu feuern.

Der einfachste Ansatz ich mir vorstellen kann ist:

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

Es ist wichtig configureCell: Implementierung auf Hauptthread aufzurufen, wie es gewohnt auf nicht-UI-Thread (die gleiche Geschichte mit reloadData/reloadRowsAtIndexPaths:). Manchmal kann es hilfreich sein, hinzuzufügen:

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

Es lohnt sich auch der Arbeit zu vermeiden, die außerhalb des aktuell sichtbaren Ansicht erfolgen würde:

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

Warum sollten Sie nicht möchten, dass der Delegierte angerufen wird? – kernix

+0

Dies ist der beste Ansatz, da die Tabellenansicht nicht im Gegensatz zu den Methoden reloadRowsAtIndexPaths: oder reloadData gezwungen wird, einen Bildlauf bis ganz nach oben durchzuführen. – ZviBar

+0

Ich tat dies und wurde von der Tatsache gefangen, dass die Zelle recycelt wurde –

5

Swift 3:

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

I brauche die Upgrade-Zelle, aber ich möchte die Tastatur schließen. Wenn ich

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

die Tastatur

Verwandte Themen