2010-08-11 8 views
7

Ich habe eine UITableView mit Zellen, die eine UISwitch Kontrolle enthalten. Es ist ähnlich wie der Tabellenansicht in der Uhr-App iPhone unten ...Wenn ich ein UISwitch-Steuerelement zu jeder meiner Tabellenansichtszellen hinzufüge, wie kann ich feststellen, zu welcher Zelle es gehört?

alt text http://epicself.com/wp-content/uploads/2009/04/1-1.jpg

In meiner App cellForRowAtIndexPath Methode, ich erstellen und fügen Sie die UISwitch Steuerung wie so ...

CGRect frameSwitch = CGRectMake(215.0, 10.0, 94.0, 27.0); 
UISwitch *switchEnabled = [[UISwitch alloc] initWithFrame:frameSwitch]; 
[switchEnabled addTarget:self action:@selector(switchToggled:) forControlEvents:UIControlEventValueChanged]; 

cell.accessoryView = switchEnabled; 

Meine Frage ist, wenn der Schalter vom Benutzer umgeschaltet wird und die switchToggled Methode aufgerufen wird, wie kann ich sagen, zu welcher Tabellenzelle es gehört? Ich kann nicht viel damit anfangen, ohne den Kontext zu kennen.

Vielen Dank im Voraus für Ihre Hilfe!

Antwort

9

In Ihrer Aktion Methode können Sie werfen die der übergebenen UISwitch (die die UITableViewCell selbst ist), dann übergeben das zu der tableViewindexPathForCell Methode.

indexPathForCell wird ein NSIndexPath Objekt zurückgeben, das Sie dann verwenden können, um zu Ihrem Datamodell zu indizieren, zu ändern. Dann müssen Sie nur reloadData auf Ihrem tableView anrufen.

In cellForRowAtIndexPath sollten Sie den Status UISwitch basierend auf Ihrem Modell festlegen.

+1

Dies ist eigentlich ein viel besserer Ansatz, weil es nicht das Tag-Attribut, die in der Regel eine gute Sache zu haben ist, nutzen, danke! – BeachRunnerFred

+5

Nur für diejenigen, die immer noch ein Problem mit der Superview gefunden haben, müssen Sie manchmal auf die Superview der Superview des Steuerelements zeigen, da das Steuerelement möglicherweise in der UITableViewCellContentView sein. Der Superview für die UITableViewCellContentView wird die erforderliche UITableViewCell sein – mrd3650

9

Zunächst einmal beheben, um das Speicherleck:

UISwitch *switchEnabled = [[[UISwitch alloc] initWithFrame:frameSwitch] autorelease]; 

Dann eine dieser Optionen wählen:

switchEnabled.tag = someInt; // before adding it to the cell 

NSLog(@"switched %d",switch.tag); // to see which switch was toggled 

oder

UITableViewCell *parentCell = switchEnabled.superview; 
// + some magic to see which cell this actually is 
+0

+1 für '.tag'. Das ist der einfachste Weg. Lade das mit dem Index in das Datenfeld, aus dem du die Tabelle bevölkerst. –

+0

danke, mvds! Die Tag-Eigenschaft wird es gut machen! Es gab kein Leck, ich habe nur vergessen, meine Freigabe in die Frage aufzunehmen. – BeachRunnerFred

Verwandte Themen