UISwitch innerhalb benutzerdefinierten UITableViewCell nicht verfügbar
-
19-09-2019 - |
Frage
Ich habe eine UISwitch
in einem benutzerdefinierten UITableViewCell
(die Unterklasse von denen ich nenne RootLabeledSwitchTableCell
).
Die Zelle enthält eine UILabel
und UISwitch
nebeneinander.
Ich habe eine @property
genannt keychainSwitch
, dass die Punkte an den Schalter innerhalb dieser benutzerdefinierten Zelle:
@interface RootLabeledSwitchTableCell : UITableViewCell {
IBOutlet UILabel *textLabel;
IBOutlet UISwitch *labeledSwitch;
}
@property (nonatomic, retain) IBOutlet UILabel *textLabel;
@property (nonatomic, retain) IBOutlet UISwitch *labeledSwitch;
@end
In meinem Tisch Ansicht delegiert, habe ich einen Selektor hinzugefügt, wenn der Schaltzustand wird umgedreht bezeichnet wird:
- (UITableViewCell *) tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *CellIdentifier = [NSString stringWithFormat: @"%d:%d", [indexPath indexAtPosition:0], [indexPath indexAtPosition:1]];
UITableViewCell *cell = [tv dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
switch (indexPath.section) {
case(kMyFirstSection): {
switch (indexPath.row) {
case(kMyFirstSectionFirstRow) {
[cellOwner loadMyNibFile:@"RootLabeledSwitchTableCell"];
cell = (RootLabeledSwitchTableCell *)cellOwner.cell;
self.keychainSwitch = [(RootLabeledSwitchTableCell *)cell labeledSwitch];
[self.keychainSwitch addTarget:self action:@selector(keychainOptionSwitched) forControlEvents:UIControlEventValueChanged];
break;
}
// ...
}
}
// ...
}
}
So dieser Selektor korrekt funktioniert:
- (void) keychainOptionSwitched {
NSLog(@"Switched keychain option from %d to %d", ![self.keychainSwitch isOn], [self.keychainSwitch isOn]);
}
Allerdings kann ich nicht die UISwitch
Instanz -setOn:animated:
Methode verwenden, um den Ausgangszustand zu initialisieren:
- (void) updateInterfaceState {
BOOL isFirstTimeRun = [[[NSUserDefaults standardUserDefaults] objectForKey:kIsFirstTimeRunKey] boolValue];
if (isFirstTimeRun) {
[self.keychainSwitch setOn:NO animated:NO];
}
}
Von Tests ist self.keychainSwitch
nil
die -setOn:animated
nichts zu tun verursacht, aber ich kann arbeiten noch die Schalter und die NSLog
Anweisung wird die Schaltzustandsänderungen richtig gedruckt werden, z.
[Session started at 2009-08-24 07:04:56 -0700.]
2009-08-24 07:04:58.489 MyApp[29868:20b] keychain switch is: nil
2009-08-24 07:05:00.641 MyApp[29868:20b] Switched keychain option from 1 to 0
2009-08-24 07:05:01.536 MyApp[29868:20b] Switched keychain option from 0 to 1
2009-08-24 07:05:02.928 MyApp[29868:20b] Switched keychain option from 1 to 0
Gibt es etwas, was ich bin fehlt etwa self.keychainSwitch
im UITableView
Delegatmethode Einstellung?
Lösung
Ich tat dies vor einer Weile. Sie sollten Ihre selctor ändern
[self.keychainSwitch addTarget:self action:@selector(keychainOptionSwitched:) forControlEvents:UIControlEventValueChanged];
Und dann aktualisieren Sie Ihre Methode
-(void) keychainOptionSwitched:(id)sender {
UISwitch *tempSwitch = (UISwitch *)sender;
}
Jetzt Tempswitch ist der Schalter, geändert wurde.
Andere Tipps
verbrachte ich im Alter von Hantieren mit benutzerdefinierten UITableViewCells mit einem einfachen Etikett und einschalten, bevor ich mich gerade entdeckt, konnte eine UISwitch als Zubehör-Ansicht . Du bist wahrscheinlich bewusst diese sowieso, und will die benutzerdefinierte Zelle aus anderen Gründen, aber nur für den Fall wollte ich dies erwähnen!
Sie tun dies wie folgt (in der -tableView: cellForRowAtIndexPath-Methode):
UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
cell.accessoryView = mySwitch;
Das accessoryView Bit kümmert sich auch um die Dimensionierung und Positionierung, so dass wir mit CGRectZero wegkommen kann.
Sie sind dann in der Lage, das System Steuerereignis und Seton Methode wie folgt zu verwenden (Anmerkung wir werfen es als UISwitch Zeiger, dass wir wissen, es ist):
[(UISwitch *)cell.accessoryView setOn:YES]; // Or NO, obviously!
[(UISwitch *)cell.accessoryView addTarget:self action:@selector(mySelector)
forControlEvents:UIControlEventValueChanged];
Ich hoffe, das hilft!
Ich denke, was hier passiert, dass Sie versuchen, die Operation aufzurufen, wenn die Zelle aus der Sicht ist, so, was los ist, dass die Zelle zu diesem Zeitpunkt entladen wird daher erhalten Sie eine Null immer für den Schlüsselbund-Schalter, einmal es kommt in Sicht dann seine nicht mehr gleich Null, da seine neu geladen. Aber ich sehe, dass Sie den Schalter zuweisen wie so
self.keychainSwitch = [(RootLabeledSwitchTableCell *)cell labeledSwitch];
Es ist ein Verweis auf den Schalter in der Tabellenzelle und Sie werden es nicht zu halten, so dass es da macht, dass der Schalter gleich Null ist immer da, wenn die Zelle Sicht erlischt entladen und keychainSwitch immer Null als Ergebnis und deshalb Ihr Klassenmitglied ist immer Null als auch. Vielleicht möchten Sie keychainSwitch behalten und dann, wenn Sie Ihren Tisch c Rekonstruktion ell den Schalter aus keychainSwitch, oder etwas Ähnliches bekommen. Hoffe, das hilft