如何访问发送者的父视图?

3

我有一个自定义单元格内的按钮。当点击该按钮时,通过模态转场方式呈现一个视图。

我的问题是,在 prepareForSegue:sender: 方法中,我想获取包含已推送的按钮(sender)的单元格的 indexPath。如何获取该单元格的 indexPath?

我认为可以尝试以下操作:

UITableViewCell * cell = sender.parent 

很明显,它不是那样工作的。

请帮我一下。

更新 感谢 @rmaddy 的帮助,我尝试了 [[sender superview] superview] 并找到了包含按钮的单元格及其 indexPath。感谢大家的回答!

5个回答

7
假设 sender 是某种类型的 UIVIew (例如一个 UIButton),那么:
UIView *parentView = [(UIView *)sender superview];

如果您确定按钮的父视图是表格单元格,则可以执行以下操作:
UITableViewCell *cell = (UITableViewCell *)[(UIView *)sender superview];

一旦您获得了单元格,使用表视图的 indexPathForCell: 方法。

请注意,如果您确实将按钮添加到单元格的 contentView 或其他子视图中,则从按钮获取单元格会稍微有些棘手。


使用调试器逐步执行代码。验证您获取的单元格是正确的单元格(而不是nil)。 - rmaddy
我不确定如何检查。从逻辑上讲,因为我正在调用发送者(一个位于自定义单元格内部的UIButton)的superview(我的自定义单元格),它应该返回给我该单元格。然后我可以在indexPathForCell:方法中使用它。但是,它一直返回给我0。当我将模型segue重新连接到IB中的Accessory View时,一切都很顺利(当我使用单元格选择作为segue触发器时也有效)。 - Sergey Katranuk
但是按钮可能会添加到单元格的contentView中。使用调试器或添加一个NSLog并打印对superview的调用结果,确保返回的对象确实是单元格而不是其他视图。 - rmaddy
我只是凭直觉猜到了答案 :) 我使用了 UITableViewCell *cell = (UITableViewCell *)[(UIView *)[sender superview] superview]; 这行代码。换句话说,我获取了父视图的父视图 - 现在它可以工作了! :) - Sergey Katranuk
是的,如果不是你的提示,我就找不到它了。谢谢rmaddy,你救了我的一天! - Sergey Katranuk
显示剩余4条评论

1
您可以使用 superview 属性访问视图的父视图。
sender.superview

这只回答了问题的一半。 - rmaddy
我理解这个问题是他不知道如何获取发送者的父视图,如果他知道如何做到这一点,他就可以解决剩下的问题。 - Shizam
他特别问道:“我该如何获取那个单元格的indexPath?” - rmaddy
@rmaddy说得对。我的真正问题是如何获取那个indexPath,因为我已经发现,sender.superview行不通。 - Sergey Katranuk

0
只需在 cellForRow... 方法中添加即可。
cellButton.tag = indexPath.row;

并在按下此按钮或您拥有该按钮的引用时将其返回


基于indexPaths的按钮标签在允许插入和/或删除行的表格上会失败。 - rmaddy
@rmaddy 是的,你说得对。但是如果您不插入/删除行,这是一个不错的解决方案。 - Inder Kumar Rathore
是的,在那种情况下很方便。 - rmaddy

0

试一试

UIButton *btn = (UIButton*)sender;
UITableViewCell * cell = (UITableViewCell*)[btn superview];
NSIndexPath *indx = [myTable indexPathForCell:cell];

0

单元格中添加了一个隐藏元素:UITableViewCellScrollView。在UITableViewCell和内容视图之间添加了UITableViewCellScrollView。第一个发送者的父视图将返回与内容视图对应的UIView对象。第二个父视图将返回UITableViewCellScrollView,第三个父视图将返回UITableViewCell。然后使用indexPathForCell方法获取单元格的索引。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接