如何从UITableViewCell获取UITableView?

105

我有一个与对象相关联的UITableViewCell,我需要知道这个单元格是否可见。从我所做的研究来看,这意味着我需要以某种方式访问包含它的UITableView(从那里,有几种方法可以检查它是否可见)。因此,我想知道UITableViewCell是否有指向UITableView的指针,或者是否有其他方法从单元格中获取指针?


2
这是什么目的? - max_
[cell superView] 可能是什么? - Chris Loonam
6
值得解释一下为什么你认为需要这个功能,因为这可能是糟糕设计的迹象,我真的想不出有很多合法理由让单元格知道它是否在屏幕上。 - Paul.s
@PJ_Finnegan 那是在我以前的工作中的两年半之前。对不起,我不记得我们当时在做什么或为什么要这样做。 - chadbag
1
@chadbag 不用担心,希望我能给有同样问题的其他人提供一些想法。 - PJ_Finnegan
显示剩余2条评论
21个回答

2
我从以上答案中借鉴并做了一些修改,得到了以下片段。
- (id)recursivelyFindSuperViewWithClass:(Class)clazz fromView:(id)containedView {
    id containingView = [containedView superview];
    while (containingView && ![containingView isKindOfClass:[clazz class]]) {
        containingView = [containingView superview];
    }
    return containingView;
}

传递类提供了在某些情况下遍历和获取除UITableView之外的其他视图的灵活性。


2

我对这个问题的解决方案与其他解决方案有些相似,但使用了优雅的for循环,而且代码简短。它也应该是面向未来的:

- (UITableView *)tableView
{
    UIView *view;
    for (view = self.superview; ![view isKindOfClass:UITableView.class]; view = view.superview);
    return (UITableView *)view;
}

1
如果在调用时单元格尚未出现在表视图中,则此代码将无限循环。为了解决这个问题,请添加一个检查 nil 的语句:for (view = self.superview; view && ![view isKindOfClass:UITableView.class]; view = view.superview); - Antonio Nunes

2

我基于Gabe的建议,认为在iOS7 beta5中UITableViewWrapperView对象是UITableViewCell对象的父视图。

继承UITableviewCell

- (UITableView *)superTableView
{
    return (UITableView *)[self findTableView:self];
}

- (UIView *)findTableView:(UIView *)view
{
    if (view.superview && [view.superview isKindOfClass:[UITableView class]]) {
        return view.superview;
    }
    return [self findTableView:view.superview];
}

1

尝试使用["UItableViewvariable" visibleCells],而不是superview。

我在foreach循环中使用它来遍历应用程序看到的单元格,它起作用了。

for (UITableView *v in [orderItemTableView visibleCells])//visibleCell is the fix.
{
  @try{
    [orderItemTableView reloadData];
    if ([v isKindOfClass:[UIView class]]) {
        ReviewOrderTableViewCell *cell = (ReviewOrderTableViewCell *)v;
        if (([[cell deleteRecord] intValue] == 1) || ([[[cell editQuantityText] text] intValue] == 0))
            //code here 
    }
  }
}

非常好用。


1

虽然经过最小化测试,但这个非泛型的Swift 3示例似乎可以工作:

extension UITableViewCell {
    func tableView() -> UITableView? {
        var currentView: UIView = self
        while let superView = currentView.superview {
            if superView is UITableView {
                return (superView as! UITableView)
            }
            currentView = superView
        }
        return nil
    }
}

0
extension UIView {
    func parentTableView() -> UITableView? {
        var viewOrNil: UIView? = self
        while let view = viewOrNil {
            if let tableView = view as? UITableView {
                return tableView
            }
            viewOrNil = view.superview
        }
        return nil
    }
}

0

你只需一行代码就能获得它。

UITableView *tableView = (UITableView *)[[cell superview] superview];

0
我建议您按照以下方式遍历视图层次结构以查找父级UITableView:
- (UITableView *) findParentTableView:(UITableViewCell *) cell
{
    UIView *view = cell;
    while ( view && ![view isKindOfClass:[UITableView class]] )
    {
#ifdef DEBUG
        NSLog( @"%@", [[view  class ] description] );
#endif
        view = [view superview];
    }

    return ( (UITableView *) view );
}

否则,当苹果再次更改视图层次结构时,您的代码将会崩溃。 另一个答案也遍历了递归层次结构。

0
UITableViewCell Internal View Hierarchy Change in iOS 7

Using iOS 6.1 SDK

    <UITableViewCell>
       | <UITableViewCellContentView>
       |    | <UILabel>

Using iOS 7 SDK

    <UITableViewCell>
       | <UITableViewCellScrollView>
       |    | <UIButton>
       |    |    | <UIImageView>
       |    | <UITableViewCellContentView>
       |    |    | <UILabel>


The new private UITableViewCellScrollView class is a subclass of UIScrollView and is what allows this interaction:


![enter image description here][1]


  [1]: http://i.stack.imgur.com/C2uJa.gif

http://www.curiousfind.com/blog/646 谢谢


0

这段代码 `UITableView *tblView=[cell superview]; 将会给你一个包含表格视图单元格的UItableview实例。


这样做是行不通的,因为UITableViewCell的直接父视图不是UITableView。从iOS 7开始,UITableViewCell的父视图是UITableViewWrapperView。请参阅此处的其他答案,以获取更少脆弱、更可靠的方法。 - JaredH

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