你的方法很接近。我在类似情况下所做的是创建单独的 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,您可以访问单元格的索引路径。您还可以通过显式使用 ivar 来存储单元格的 NSIndexPath 并使用方法调用传递整个单元格来绕过 tag 属性的使用。