Pergunta

Eu tenho um UISwitch dentro de um UITableViewCell personalizado (subclasse de que eu chamo RootLabeledSwitchTableCell).

A célula contém uma UILabel e UISwitch ao lado do outro.

Eu tenho um @property chamado keychainSwitch que aponta para a chave dentro desta célula personalizado:

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

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

@end

Na minha mesa vista delegado, eu adicionei um seletor que é chamado se o estado interruptor é invertida:

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

Assim, este selector funciona corretamente:

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

No entanto, eu não posso usar o método UISwitch da instância -setOn:animated: para inicializar seu estado inicial:

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

A partir de testes, self.keychainSwitch é nil que está causando -setOn:animated para não fazer nada, mas eu ainda pode operar o interruptor e a declaração NSLog será impresso corretamente as mudanças de estado do interruptor, por exemplo:.

[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

Existe algo que eu estou ausente sobre a configuração self.keychainSwitch no método UITableView delegado?

Foi útil?

Solução

Eu fiz isso um tempo atrás. Você deve mudar a sua selctor

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

E, em seguida, atualizar seu método para

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

Agora tempSwitch é a chave que foi alterado.

Outras dicas

I passado as idades brincar com UITableViewCells personalizados com uma etiqueta simples e ligue-o antes que eu descobri que eu poderia apenas adicionar um UISwitch como uma visão acessório . Você provavelmente está ciente de isso de qualquer maneira, e deseja que a célula personalizado por outras razões, mas apenas no caso eu queria mencionar isso!

Você pode fazer isso da seguinte forma (na -tableView: método cellForRowAtIndexPath):

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

O accessoryView também pouco cuida do dimensionamento e posicionamento, para que possamos sair com CGRectZero.

Você é então capaz de usar o evento de controle do sistema e método de Seton como segue (note que lançá-lo como o ponteiro UISwitch que sabemos que é):

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

Espero que ajude!

Eu acho que o que está acontecendo aqui é que você está tentando chamar a operação quando a célula está fora de vista, então o que está acontecendo é que a célula é descarregada naquele tempo, portanto, você está recebendo um nulo para o interruptor chaveiro, uma vez que entra em vista, em seguida, a sua não nulo desde a sua recarregado. Mas eu vejo que você está atribuindo o interruptor como assim

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

Seu uma referência para o interruptor na célula da tabela e você não está retendo-o, por isso, faz desde que o interruptor está se tornando nulo uma vez que, quando a célula sai de vista é descarregado e keychainSwitch está se tornando nil como um resultado e portanto, o seu membro da classe está se tornando nula também. Você pode querer manter keychainSwitch e então quando reconstruir sua mesa c ell obter a chave fora do keychainSwitch, ou algo do tipo. Espero que isso ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top