从子视图中引用包含 UIView?

Posted

技术标签:

【中文标题】从子视图中引用包含 UIView?【英文标题】:Referencing containing UIView from a subview? 【发布时间】:2012-07-07 13:57:36 【问题描述】:

当我将 UIView 子类对象添加到 UIView - 例如原型 UITableViewCell 中的 UISwitch 并通过 IBAction 将此开关与 ViewController 连接时,如何在此操作中找出调用的 UISwitch 所在的表行?

为了清楚起见,我附上了图片 - 当调用 UISwitch 时,我想知道调用的 UISwitch 在哪一行。

【问题讨论】:

【参考方案1】:

我认为“最干净”的方法是让开关将其动作发送到单元本身。您需要继承 UITableViewCell 以实现该操作,并将其传递给视图控制器上的方法(可能通过为单元格提供视图控制器所连接的委托)。这是相当的盛况;下面有更直接但不太合适的方法。

一种方法是在首先配置表格视图单元格时(即在您的tableView:cellForRowAtIndexPath: 方法中)在 UISwitch 上指定一个tagswitch.tag = indexPath.row 之类的东西;然后,您可以稍后通过询问其标签来从交换机中检索该行。

另一种方法是向上搜索 UISwitch 的超级视图,直到找到 UITableViewCell,然后找到它的行。比如:

UIView *view = switch.superview;
while (view && ![view isKindOfClass:[UITableViewCell class]]) 
    view = view.superview;

// at this point, view is nil or a table view cell; ask the table view for its index path
if (view) 
    NSIndexPath *path = [tableView indexPathForCell:cell];

【讨论】:

我刚刚发现第一种方法不适用,因为单元格可重用。 只要每次从tableView:cellForRowAtIndexPath:返回单元格时都将标签分配给开关,第一种方法应该可以很好地重复使用

以上是关于从子视图中引用包含 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

从子视图调用超级视图函数

如何从子视图内的编程 UIButton 执行 segue?

从子视图刷新 UIView

将图像从子视图绘制到父视图

iOS:如何将触摸事件从子视图转发到超级视图? [复制]

Backbone - 从子视图调用/引用父视图