Pregunta

Tengo un UISwitch dentro de un UITableViewCell personalizado (la subclase de los cuales llamo RootLabeledSwitchTableCell).

La celda contiene un UILabel y UISwitch uno junto al otro.

Tengo una llamada @property keychainSwitch que apunta hacia el interruptor dentro de esta celda personalizado:

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

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

@end

En mi mesa con vista al delegado, he añadido un selector que se llama si se invierte el estado del interruptor:

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

Así que este selector funciona correctamente:

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

Sin embargo, no puedo utilizar el método UISwitch de la instancia -setOn:animated: para inicializar su estado inicial:

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

A partir de las pruebas, es self.keychainSwitch nil que está causando -setOn:animated no hacer nada, pero todavía se puede accionar el interruptor y la declaración NSLog se imprimirá correctamente los cambios de estado del interruptor, por ejemplo:.

[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

¿Hay algo que me falta acerca de la configuración self.keychainSwitch en el método UITableView delegado?

¿Fue útil?

Solución

Lo hice hace un tiempo. Debe cambiar su selctor

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

Y a continuación, actualizar su método a

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

Ahora tempSwitch es el interruptor que se ha cambiado.

Otros consejos

Me pasé siglos perder el tiempo con UITableViewCells personalizados con una simple etiqueta y el interruptor en él antes de descubrir que sólo podía añadir un UISwitch como una vista accesorio . Usted es probablemente consciente de esto de todos modos, y desea que la celda personalizado por otras razones, pero en caso de que quería mencionar esto!

Esto se hace de la siguiente manera (en el -tableView: Método cellForRowAtIndexPath):

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

El bit accessoryView también se encarga del tamaño y ubicación para que podamos salir con CGRectZero.

Usted es entonces capaz de utilizar el evento de control del sistema y método de Seton de la siguiente manera (en cuenta que proyectarlo como el puntero UISwitch que sabemos es):

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

Espero que ayude!

Creo qué está sucediendo aquí es que usted está tratando de solicitar la operación cuando la célula está fuera de la vista, por lo que esta pasando es que la célula se descarga en ese momento, por tanto, que está recibiendo un nulo para el interruptor llavero, una vez que está a la vista, entonces es no nula desde su recargado. Pero veo que está asignando el interruptor como tal

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

Es una referencia al interruptor en la celda de la tabla y no se está reteniendo él, así que tiene desde que el interruptor está convirtiendo nulo puesto que, cuando la célula va fuera de la vista se descarga y keychainSwitch está convirtiendo nula como consecuencia y Por lo tanto, el miembro de la clase se está convirtiendo nula también. Es posible que desee mantener keychainSwitch y luego, cuando la reconstrucción de su mesa ana de c conseguir el interruptor de keychainSwitch, o algo por el estilo. Esperamos que esto ayude

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top