Domanda

Ho un UISwitch all'interno di un'usanza UITableViewCell (la sottoclasse di cui chiamo RootLabeledSwitchTableCell).

La cella contiene a UILabel E UISwitch vicini l'uno all'altro.

Ho un @property chiamato keychainSwitch che punta all'interruttore all'interno di questa cella personalizzata:

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

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

@end

Nel mio delegato della visualizzazione tabella, ho aggiunto un selettore che viene chiamato se lo stato dell'interruttore viene invertito:

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

Quindi questo selettore funziona correttamente:

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

Tuttavia, non posso utilizzare il file UISwitch istanza -setOn:animated: metodo per inizializzare il suo stato iniziale:

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

Dai test, self.keychainSwitch È nil che sta causando -setOn:animated per non fare nulla, ma posso ancora azionare l'interruttore e il NSLog stamperà correttamente le modifiche dello stato dell'interruttore, ad esempio:

[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

C'è qualcosa che mi manca nell'impostazione self.keychainSwitch nel UITableView metodo delegato?

È stato utile?

Soluzione

L'ho fatto qualche tempo fa. Si dovrebbe cambiare il tuo selctor

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

E poi aggiornare il metodo di

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

Ora tempSwitch è l'interruttore che è stato modificato.

Altri suggerimenti

Ho passato anni a giocherellare con UITableViewCells personalizzati con una semplice etichetta e accenderlo prima di scoprire che potevo semplicemente aggiungi un UISwitch come vista accessoria.Probabilmente ne sei comunque a conoscenza e desideri la cella personalizzata per altri motivi, ma nel caso volessi menzionarlo!

Puoi farlo come segue (nel metodo -tableView:cellForRowAtIndexPath):

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

Il bit accessorioView si occupa anche del dimensionamento e del posizionamento in modo da poter farla franca con CGRectZero.

Potrai quindi utilizzare l'evento di controllo del sistema e il metodo setOn come segue (nota che lo abbiamo lanciato come puntatore UISwitch che sappiamo che sia):

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

Spero che aiuti!

Credo che quello che accade qui è che si sta tentando di richiamare l'operazione quando la cellula è fuori di vista, in modo da che cosa sta succedendo è che la cellula viene scaricato in quel momento quindi si stanno ottenendo un pari a zero per l'interruttore portachiavi, una volta si entra in vista allora la sua non nullo dalla sua ricaricato. Ma vedo che si sta assegnando l'interruttore in questo modo

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

E 'un riferimento al interruttore nella cella della tabella e non si sta mantenendo esso, in modo che rende in quanto che l'interruttore è sempre pari a zero in quanto, quando la cellula va fuori di vista sia scarica e keychainSwitch sta diventando pari a zero come risultato e quindi il vostro membro della classe è sempre pari a zero pure. Si potrebbe desiderare di mantenere keychainSwitch e poi quando ricostruire il vostro tavolo c ell ottenere l'interruttore di keychainSwitch, o qualcosa del genere. Spero che questo aiuti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top