【问题标题】:Getting NSIndexPath of a row for UISwitch为 UISwitch 获取一行的 NSIndexPath
【发布时间】:2012-03-19 14:31:20
【问题描述】:

我有一个带有自定义 UITableViewCells 的表格视图,表格中的每一行都有一个 UILabel、UISwitch 和详细信息披露指示器。

我正在寻找为开关捕获 UIControlEventChanged 的​​最佳方法,但我还需要更改为更新核心数据的开关的 NSIndexPath。

我也不希望 UISwitch 作为附件类型。

我已经在谷歌上搜索了几个小时,不断弹出的解决方案是使用

[switch addTarget:self action:@selector(switchTapped:) forControlEvents:UIControlEventChanged];

然后在 switchTapped: 方法中使用以下方法获取 NSIndexPath

NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]];

有没有更好的方法来做到这一点?我已经有 UITableViewCell 的子类,我可以在这个类中放置一个方法来返回给定开关的 NSIndexPath 吗?

提前感谢您的帮助

【问题讨论】:

  • 但是,如果视图层次结构在任何时候发生变化,例如 iOS 更新,这将失败。
  • 好点子,你可以找到第一个类型为UITableViewCell 的超级视图。那很可能会失败。
  • 也许我不完全理解您的问题...您的自定义 UITableViewCell 中有一个 UISwitch ,并且 UITableViewCell 处理正在更改的开关。这就是你说的吗?然后你不能创建一个协议并将你的 tableViewController 设置为那个单元格的代表吗?你能发布额外的代码来说明你的问题吗?
  • @NickBull 我使用上面的代码让它工作。在 cellForRowAtIndexPath: 我有 [switch addTarget:self action:@selector(switchTapped:) forControlEvents:UIControlEventChanged];然后在switchTapped:我有上面的代码 NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *)[[sender superview] superview]];获取 UITableViewCell ,它允许我获取该单元格的 NSIndexPath 。但我不喜欢嵌套的 superview 方法来查找 UITableViewCell 并且寻求更好的方法
  • 那么所有这些都属于同一类吗?这就是我要说的。从你所说的来看,你似乎把太多的知识放在了一节课上。你需要把它分开。然后,您可以更轻松地访问信息,而不必依赖于浏览视图层次结构,这只是自找麻烦。

标签: iphone objective-c ipad ios5 nsindexpath


【解决方案1】:

我将利用另一个机会链接到我的答案here - 标签和视图层次结构行走很笨重、容易出错且不必要,我看到它们在 SO 答案中到处都是推荐的。您可以使用其框架和表格视图的indexPathForRowAtPoint: 方法找到任何控件的索引路径。

【讨论】:

  • 感谢您的回复,这似乎是一个更好的方法。
【解决方案2】:

在表格的每一行中为开关设置合适的标签是一种可行的方案。根据标签所在行的索引路径设置标签。

这样您就可以避免视图层次结构更改可能出现的问题。

This 的帖子也可能对您有所帮助。

【讨论】:

  • 一开始这听起来不错,但当您开始删除和重新排列行时就坏了。
猜你喜欢
  • 1970-01-01
  • 2022-01-04
  • 2012-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
相关资源
最近更新 更多