【问题标题】:How to know superview hierarchy [duplicate]如何知道超级视图层次结构[重复]
【发布时间】:2014-08-26 15:50:36
【问题描述】:

我已使用此代码从我的UITableViewCell 中获取UIButton,但它不起作用。所以我调试了半个小时才知道它在哪个superview中。

UIButton *button = (UIButton *)sender;
UITableViewCell* cell = (UITableViewCell*)button.superview.superview.superview;
UITableView* tableView = (UITableView*) cell.superview.superview;
NSIndexPath* indexPath = [tableView indexPathForCell:cell];

我现在的问题是:我如何知道将来 UITableView 或其他的层次结构是什么?没有一个列表可以让我看到我需要多少超级视图不对其进行 100 次测试并设置 BreakPoints 以查看它指的是什么类?

问候

【问题讨论】:

  • 在你的代码中添加一个断点...当它暂停时,试试po [UIWindow recursiveDescription]; 你可以用几乎任何有效的 UIView 替换 UIWindow。不过,我会谨慎使用这种方法,因为@architectpianist 正确地提到了它的问题。
  • 我谦虚地建议我在标记副本中的解决方案作为解决此问题的最佳方法。

标签: ios objective-c


【解决方案1】:

您最终可能会选择超级视图层次结构路线,但要知道这不是一个好主意,因为 Apple 可以随时更改其表视图层次结构。给定一个单元格内的按钮,有更好的方法来获取表格视图单元格的索引路径。

  1. 如果所有按钮都在表格视图的一个部分中,只需将每个按钮的标签设置为单元格的索引路径行。然后您可以知道按钮在哪一行重新创建索引路径。

  2. 您始终可以继承UITableViewCell 并在子类中实现按钮的操作方法。子类可能会调用一个委托方法给任何想知道按钮点击的对象。

因此,希望这能让您了解您之前所做的替代方案。正如您所说,弄清楚 superview 层次结构非常耗时,而且它随时可能发生变化。

【讨论】:

    【解决方案2】:

    如果你想检查多个超级视图层次结构,那么检查如下:-

    UIView * view=(UIView*)sender;
    
    while ((view= [view superview])) {
        if(viewisKindOfClass:[UITableView class]) {
            //your code
            return;
        }
    }
    

    【讨论】:

    • 使用UIButton类型的变量是不合适的。
    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2013-07-04
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多