UISwitch all'interno di UITableViewCell personalizzato non disponibile
-
19-09-2019 - |
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?
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