Question

J'ai un UISwitch dans un UITableViewCell personnalisé (la sous-classe dont j'appelle RootLabeledSwitchTableCell).

La cellule contient un UILabel et UISwitch à côté de l'autre.

J'ai un @property appelé keychainSwitch qui pointe vers le commutateur dans cette cellule personnalisée:

@interface RootLabeledSwitchTableCell : UITableViewCell {
    IBOutlet UILabel *textLabel;
    IBOutlet UISwitch *labeledSwitch;
}

@property (nonatomic, retain) IBOutlet UILabel *textLabel;
@property (nonatomic, retain) IBOutlet UISwitch *labeledSwitch;

@end

À mon avis tableau délégué, j'ai ajouté un sélecteur qui est appelé si l'état de commutation est basculée:

- (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;
               }
               // ...
           }
       }
       // ...
   }
}

Donc, ce sélecteur fonctionne correctement:

- (void) keychainOptionSwitched {
   NSLog(@"Switched keychain option from %d to %d", ![self.keychainSwitch isOn], [self.keychainSwitch isOn]);
}

Cependant, je ne peux pas utiliser la méthode de UISwitch de l'instance -setOn:animated: pour initialiser son état initial:

- (void) updateInterfaceState {
   BOOL isFirstTimeRun = [[[NSUserDefaults standardUserDefaults] objectForKey:kIsFirstTimeRunKey] boolValue];
   if (isFirstTimeRun) {
      [self.keychainSwitch setOn:NO animated:NO];
   }
}

De test, self.keychainSwitch est nil qui est à l'origine -setOn:animated à ne rien faire, mais je peux encore faire fonctionner l'interrupteur et l'instruction NSLog seront correctement imprimer les changements d'état de commutation, par exemple:.

[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

Y at-il quelque chose que je suis absent sur la définition self.keychainSwitch dans la méthode délégué UITableView?

Était-ce utile?

La solution

Je l'ai fait il y a un certain temps. Vous devriez changer votre selctor

[self.keychainSwitch addTarget:self action:@selector(keychainOptionSwitched:) forControlEvents:UIControlEventValueChanged];

Et puis mettez à jour votre méthode

-(void) keychainOptionSwitched:(id)sender {
UISwitch *tempSwitch = (UISwitch *)sender;
}

tempSwitch est le commutateur qui a été modifié.

Autres conseils

J'ai passé les âges bidouiller avec UITableViewCells personnalisés avec une étiquette simple et allume avant que j'ai découvert que je pouvais ajouter un UISwitch comme une vue accessoire . Vous êtes probablement au courant de toute façon, et que vous voulez la cellule personnalisée pour d'autres raisons, mais juste au cas où je voulais mentionner!

Vous faites cela comme suit (dans la -tableView: méthode cellForRowAtIndexPath):

UISwitch *mySwitch = [[[UISwitch alloc] initWithFrame:CGRectZero] autorelease];
cell.accessoryView = mySwitch;

Le bit accessoryView prend également en charge le dimensionnement et le positionnement afin que nous puissions sortir avec CGRectZero.

Vous êtes alors en mesure d'utiliser l'événement de contrôle du système et la méthode setOn comme suit (noter que nous jetons comme le pointeur UISwitch que nous le connaissons est):

[(UISwitch *)cell.accessoryView setOn:YES];   // Or NO, obviously!
[(UISwitch *)cell.accessoryView addTarget:self action:@selector(mySelector)
     forControlEvents:UIControlEventValueChanged];

L'espoir qui aide!

Je pense que ce qu'il se passe ici est que vous essayez d'appeler l'opération lorsque la cellule est hors de la vue, donc ce qui se passe est que la cellule est déchargée à ce moment-là donc vous obtenez un nul pour le commutateur de porte-clés, une fois il est en vue alors son plus nul depuis sa rechargées. Mais je vois que vous assignez le commutateur comme si

 self.keychainSwitch = [(RootLabeledSwitchTableCell *)cell labeledSwitch];

Sa référence au commutateur dans la cellule de table et vous ne retenez pas, donc il fait depuis que l'interrupteur devient nulle puisque, lorsque la cellule est hors de vue est déchargé et keychainSwitch devient nul en résultat et par conséquent, un membre de votre classe devient nulle aussi bien. Vous voudrez peut-être conserver keychainSwitch puis lors de la reconstruction de votre table c ell obtenir le commutateur de keychainSwitch, ou quelque chose du genre. Espérons que cela aide

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top