【问题标题】:How do I determine the indexPath for cell with a switch that has been tapped?如何确定带有已点击开关的单元格的 indexPath?
【发布时间】:2014-05-09 23:34:54
【问题描述】:

我有一个 UITableView,其中的原型单元格上有一个 UISwitch。当用户点击任何特定单元格上的开关时,我需要确定我的数据源中的哪个对象已切换其开关。

这是我的切换方法:

- (IBAction)completeSwitchTapped:(id)sender {
      UITableViewCell *cell = (UITableViewCell *)[sender superview];
      NSIndexPath *indexPath = [self.itineraryTableView indexPathForCell:cell];


      NSLog(@"cell row is: %d in section: %d", indexPath.row, indexPath.section);
}

但这总是返回第 0 部分中的第 0 行,无论选择哪一行或部分。

如何正确返回包含开关的正确单元格?显然[sender superview] 不起作用,我对如何引用单元格感到不知所措。

谢谢!

【问题讨论】:

  • 你检查你的视图层次了吗?确保您的 UISwitch 是单元格的子视图?
  • 如果你记录单元格,你会发现它实际上不是一个 UITableViewCell。
  • 用对你有意义的标识符设置开关的tag。
  • 扩展 rdelmar 的评论:sender 是 UISwitch 类型的对象,而不是 UITableViewCell 类型的对象。记住这一点,已经给出的答案可能更有意义。

标签: ios uitableview uiswitch


【解决方案1】:

试试这样的:

UIView *superview = sender.superview;
while (![superview isKindOfClass:[UITableViewCell class]] && superview.superview != nil) {
    superview = superview.superview;
}
NSIndexPath *indexPath = [self.itineraryTableView indexPathForCell:superview];

【讨论】:

  • 这行得通,但我必须使用 [superview superview] 而不是 superview.superview,而不是 sender.superview 我必须使用 [sender superview]。我不确定为什么点符号在那里不起作用。谢谢!
【解决方案2】:

创建按钮/开关时,将其标签设置为单元格行或其他有意义的值。然后在调用 IBAction 方法时简单地提取sender.tag,以检索单元格行。

【讨论】:

    【解决方案3】:

    当我必须在我自己的表中执行这样的按钮和开关时,我通常将 UIButton 或 UISwitch 子类化,在我的子类中,我将“.indexPath”或“.row”属性添加到我的子类控件。

    我在“cellForRowInIndexPath:”中返回新填充(或重置)的表格视图单元格时设置的

    这样,当您的开关或按钮被触摸时,您将拥有一个具有正确设置的行索引的属性,供您使用。

    与“superview.superview”相比,这是一种更直接、更简洁的解决方案。

    【讨论】:

    • 这听起来不错,但我讨厌继承简单的控件。我知道 superview.superview 解决方案听起来很笨拙,但我认为在代码中很容易看到(现在我知道该怎么做了)。不过谢谢!以后的事情的好主意......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多