我已经搜索了很多我的问题,但我仍然无法t resolve it.
I
尝试动态地将一些UISwitch添加到TableView并根据状态更改一些数据。
使用以下代码添加开关对我来说很好:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
}
// Configure the cell...
UISwitch *aSwitch = [[[UISwitch alloc] init] autorelease];
[aSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
[cell.contentView addSubview:aSwitch];
return cell;
}
我的问题是 - (void)switchChanged:(id)sender。如何识别哪个开关已被更改以修改正确的相应数据?
答案 0 :(得分:2)
首先,您应该更改方法,以便正确地重复使用单元格。你想用这样的东西。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
UISwitch *aSwitch = [[[UISwitch alloc] init] autorelease];
aSwitch.tag = 23;
[aSwitch addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
[cell.contentView addSubview:aSwitch];
}
UISwitch *aSwitch = [cell.contentView viewWithTag:23];
aSwitch.on = whatever;
// Configure the cell...
return cell;
}
然后你就可以得到改变后的开关的索引路径:
- (void) switchChanged:(id)sender {
UISwitch *switch = (UISwitch *)sender;
UIView *contentView = [switch superview];
UITableViewCell *cell = (UITableViewCell *)[contentView superview];
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
// do something
}
答案 1 :(得分:2)
使用 UIView 的标记属性( UISwitch 继承自 UIView ):
@property(nonatomic) NSInteger tag
这种情况正是这个属性旨在解决的问题。当您动态创建开关时,您只需增加一个静态变量。
然后在- (void) switchChanged:(id)sender
方法中,您只需检查代码的值即可。 :)
答案 2 :(得分:0)
UISwitch *switch = (UISwitch *)sender;
UIView *contentView = [switch superview];
UITableViewCell *cell = (UITableViewCell *)[contentView superview];
NSIndexPath *indexPath = [[self tableView] indexPathForCell:cell];
这将为您提供indexPath。如果您有一个数据源,也可以设置aSwitch.tag = indexPath.row
。