Sei vicino al tuo approccio. Quello che ho fatto in situazioni simili è creare sottoclassi UITableViewCell separate, impostare il tag di UISwitch come index.row del percorso dell'indice e utilizzare solo la sottoclasse UITableViewCell in una sezione specifica della vista tabella. Questo ti permette di usare il tag della cella per determinare in modo univoco quale cella ha l'evento senza mantenere una lista di indici separata (come sembra che tu stia facendo).
Poiché il tipo di cella è univoco, è possibile accedere facilmente agli altri elementi della cella creando metodi/proprietà nella sottoclasse UITableViewCell.
Ad esempio:
@interface TableViewToggleCell : UITableViewCell {
IBOutlet UILabel *toggleNameLabel;
IBOutlet UILabel *detailedTextLabel;
IBOutlet UISwitch *toggle;
NSNumber *value;
id owner;
}
@property (nonatomic, retain) UILabel *toggleNameLabel;
@property (nonatomic, retain) UILabel *detailedTextLabel;
@property (nonatomic, retain) UISwitch *toggle;
@property (nonatomic, retain) id owner;
-(void) setLable:(NSString*)aString;
-(void) setValue:(NSNumber*)aNum;
-(NSNumber*)value;
-(void) setTagOnToggle:(NSInteger)aTag;
-(IBAction)toggleValue:(id)sender;
@end
In:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// ... prior iniitalization code for creating cell is assumed
toggleCell.owner = self;
[toggleCell setLable:@"some string value"];
[toggleCell setTagOnToggle:indexPath.row];
toggleCell.owner = self;
return toggleCell;
//... handle cell set up for other cell types as needed
}
proprietario è il delegato per la cella e può quindi essere utilizzato per avviare azioni nel vostro controller. Assicurarsi di collegare il vostro UISwitch all'azione toggleValue, in modo che è possibile avviare azioni nel delegato quando l'UISwitch cambia stato:
-(IBAction)toggleValue:(id)sender;
{
BOOL oldValue = [value boolValue];
[value release];
value = [[NSNumber numberWithBool:!oldValue] retain];
[owner performSelector:@selector(someAction:) withObject:toggle];
}
Passando l'UISwitch con la chiamata di metodo, è quindi possibile accedere al percorso di indice per la cellula. Si potrebbe anche bypassare l'uso della proprietà tag esplicitamente avendo un ivar per memorizzare NSIndexPath della cella e quindi passare l'intera cella con la chiamata di metodo.
fonte
2010-04-01 12:52:47
Ho fatto la stessa cosa, il mio unico commento sarebbe stato di nominare una proprietà. – typemismatch