Table 单元格中的 UISwitch -- 确定选定的 indexPath

UISwitch in Table Cell -- determine selected indexPath

我在 UITableViewCell 的 accessoryView 中使用 UISwitch。

开关在选择或取消选择时使用目标操作进行通信:

switchV.addTarget(self, action: "onChangeSwitch:", forControlEvents: UIControlEvents.ValueChanged)

问题是确定选择了哪个开关。我知道3种方法。每个都不满意。

1.我可以use tags:

switchV.tag = indexPath.row

但是如果你有部分(我有),这很糟糕,因为我需要将它解析为双数 section/row 格式。

2. 我可以使用数据模型并将切换视图存储在单元格正在绘制的数据项上:

dataItem.switch.addTarget(self, action: "onChangeSwitch:", forControlEvents: UIControlEvents.ValueChanged)
cell.accessoryView = dataItem.switch

然后我可以通过遍历我的数据集并与发件人进行身份匹配来确定选择了哪个开关。这是很多循环,我不想将视图放入我的数据模型中。

3. 然后是this method,它使用开关的坐标来查找行。无状态,不涉及字符串解析或数据模型混乱,但涉及坐标,rly?我可以信任它吗?

tableView.indexPathForRowAtPoint(
  sender.convertPoint(CGPointZero, toView: tableView)
)

有没有更好的方法获取选中的UISwitch的indexPath?

我认为方法#3 非常好。但是,如果您希望它真的很干净,这就是我会做的。

  • 声明一个自定义 TableviewCell,比如 CustomTableViewCell,并有一个名为 CustomCellDelegate 的委托协议。在这里,委托人得到这样的通知:

     -(void)switchChanged:(UISwitch*)switch inCell:(CustomTableViewCell*)cell
    
  • 在 cellForRowAtIndexPath 中将您的视图控制器设置为单元格的委托。

  • 将开关添加到您的自定义单元格并将该单元格作为目标并实现开关的操作方法。在操作方法中调用委托:

    -(void)switchChanged:(id)sender {
        if(self.delegate && [self.delegate respondsToSelector:@selector(switchChanged:inCell:])) {
            [self.delegate switchChanged:sender inCell:self];
    }
    
  • 现在在您的viewController中使用委托方法中传入的单元格来计算索引路径:

     -(void)switchChanged:(id)sender inCell:(CustomTableViewCell*)cell {
        NSIndexPath *path = [self.tableview indexPathForCell:cell];
     }
    

这有点工作,但如果您想以正确的方式进行,您可以。

另一种选择是使用维护开关的散列 -> 数据 link

var switchToData=[UISwitch:yourData]()

在 cellForRowAtIndexPath:

switchToData[newSwitch]=myData

在 onChangeSwitch 中

dataChanged=switchToData[switchChanged]

散列会非常小,与可见开关的大小相同....