来自 contentView 子视图的 UITableViewCell

Posted

技术标签:

【中文标题】来自 contentView 子视图的 UITableViewCell【英文标题】:UITableViewCell from contentView subview 【发布时间】:2012-02-28 14:26:48 【问题描述】:

我创建了带有标签并使用 checkaMarksAccessory 的单元格。最后几个单元格具有用户可以修改的 UITextFields,并且那些在 UIControlEventEditingDidEnd 上有选择器,我想将单元格的状态更改为已检查。

如何获取选择器中的单元格?没有对象的一些 parentView?

我将对象插入单元格的方式。

    UITextField *textfield = [[UITextField alloc] initWithFrame:CGRectMake(10, 25, 200, 30)];
    [textfield setBorderStyle:UITextBorderStyleRoundedRect];
    [textfield addTarget:self action:@selector(vybavaDidFinishEdit:) forControlEvents:UIControlEventEditingDidEnd];
    [cell.contentView addSubview:textfield];

【问题讨论】:

【参考方案1】:

我不确定假设cell.contentView.superview == cell 是否安全。苹果可能会改变这一点吗?我对此表示怀疑。但是,我在文档中没有看到任何地方说单元格的内容视图是单元格的直接子视图。

如果您已将UIGestureRecognizer 添加到单元格内容视图的其中一个子视图中,那么您可以通过以下方式获取对单元格的引用:

NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:[gestureRecognizer locationInView:self.tableView]];
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

Table View Animations and Gestures sample code 这样使用indexPathForRowAtPoint:

如果你必须遍历superviews,我认为使用像下面这样的函数会更安全一些。

UITableViewCell *ACMContentViewGetCell(UIView *view)

    while ((view = view.superview)) 
        if ([view isKindOfClass:[UITableViewCell class]]) 
            return (UITableViewCell *)view;
        
    
    return nil;

但该函数仍假定 contentView 在其 cell 内,我在文档中的任何地方也没有看到。

所以也许,最好的解决方案是重新架构你的代码,这样你就不需要从contentView 获取cell,或者如果你必须,然后从contentView 的子视图添加一个实例变量到@ 987654332@.

【讨论】:

【参考方案2】:

好的,所以方法是使用superview。超级视图是拥有该对象的组件。如果我想从 UITextField 获取 UITableViewCell,我使用了 [[UITextField superview] superview]。

【讨论】:

以上是关于来自 contentView 子视图的 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

将uiscrollview子视图调整为全屏

是否不可能将子视图添加到我的 UITableViewCell 的 contentView 并使其宽度与 contentView 相等?

UICollectionViewCell 在添加到任何父视图之前没有子视图(除了 contentView)

删除 cell.contentview 上的所有子视图,标签除外

iOS 8:UITableViewCell.contentView 不会调整其中的子视图大小

iOS自动调整UITableViewHeaderFooterView.ContentView子视图中的自定义单元格宽度