2016-07-28 19 views
0

Ich entwickle eine iOS-App und verwende daher einen UITableViewController. Within „cellForRowAtIndexPath“ Ich verwende Zellen mit Wiederverwendung Bezeichner:Verweis auf eine Zelle mit Wiederverwendungskennung

[[[UITableViewCell alloc] initWithStyle:UITableViewCellStyle1 reuseIdentifier:textFieldIdentifier]; 

Das Problem ist, dass einige Zellen haben eine dependecy aufeinander, z.B. Wenn der Benutzer Text in eine Zelle eingibt, ändert eine andere Zelle ihren Wert.

Also, was ist der beste Weg, einen Verweis auf die Zelle zu sichern, die geändert werden muss? Das Problem ist, dass, wenn ich den Verweis in "cellForRowAtIndexPath" sichern, während der Rückruf für "TextFieldDidChange" die Referenz möglicherweise gebrochen, z. wenn die Zelle nicht sichtbar ist oder eine andere Zelle aufgrund der Wiederverwendungskennung die Adresse hat ?!

Antwort

1

Versuchen Sie nicht, Verweise auf zwischengespeicherte Zellen zu speichern. Aktualisieren Sie alles, was Sie benötigen, um in der Datenquelle der Tabelle anzuzeigen, und rufen Sie dann reloadData. Auf diese Weise sorgt die Tabelle dafür, sichtbare Zellen zu aktualisieren und mit dem Cache umzugehen ... also müssen Sie das nicht tun.

+1

erlauben mir ein wenig zu erweitern machen: Sie sollten ein Modell für Ihre Zellen und alle Änderungen sollten in diesem Modell berücksichtigt werden. Nachdem Sie Ihr Modell aktualisiert haben, laden Sie die entsprechenden Zellen oder die gesamte Tabelle nach Bedarf neu. – Losiowaty

0

Ich würde ein Protokoll für die Zellen

Beispiel

@protocol MyProtocol <NSobject> 
- (void) changeText:(NSString)theText; 
@end 

@interface TableViewCell1 : UITableViewCell 
@property (nonatomic, weak) id<MyProtocol> delegate; 
@end 

@implementation TableViewCell1 
//put this in the method where you get the value of the textfield 
[self.delegate chageText:@"Hello"]; 
@end 

@interface TableViewCell2 : UITableViewCell <MyProtocol> 
@end 

@implementation TableViewCell2 
- (void) chageText:(NSString *)text { 
    self.textLabel.text = text; 
} 
@end