带动态UISwitch的TableView - 如何识别交换机

时间:2011-03-01 13:02:37

标签: iphone objective-c cocoa-touch

我已经搜索了很多我的问题,但我仍然无法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。如何识别哪个开关已被更改以修改正确的相应数据?

3 个答案:

答案 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