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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top