Вы близки в вашем подходе. В подобных ситуациях я создал отдельные подклассы UITableViewCell, установил тег UISwitch равным index.row пути индекса и использовал этот подкласс UITableViewCell только в определенном разделе табличного представления. Это позволяет использовать тег ячейки, чтобы однозначно определить, в какой ячейке есть событие, без ведения отдельного списка индексов (как это звучит, как вы делаете).
Поскольку тип ячейки уникален, вы можете легко получить доступ к другим элементам ячейки, создав методы / свойства в подклассе UITableViewCell.
Например:
@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
В
- (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
}
Владелец является делегатом ячейки и может затем использоваться для инициирования действий в вашем контроллере. Убедитесь, что вы подключили UISwitch к действию toggleValue, чтобы вы могли инициировать действия в делегате при изменении состояния UISwitch:
-(IBAction)toggleValue:(id)sender;
{
BOOL oldValue = [value boolValue];
[value release];
value = [[NSNumber numberWithBool:!oldValue] retain];
[owner performSelector:@selector(someAction:) withObject:toggle];
}
Передав UISwitch с вызовом метода, вы можете получить доступ к индексному пути для ячейки. Вы также можете обойти использование свойства tag, явно имея ivar для хранения NSIndexPath ячейки, а затем передав всю ячейку с помощью вызова метода.