来自contentView子视图的UITableViewCell

时间:2012-02-28 14:26:48

标签: ios5 uitableview subviews

我使用标签和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];

2 个答案:

答案 0 :(得分:1)

我不确定假设cell.contentView.superview == cell是否安全。 Apple会改变这个吗?我对此表示怀疑。但是,我没有在文档中看到单元格的内容视图是单元格的直接子视图。

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

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

Table View Animations and Gestures sample code以这种方式使用indexPathForRowAtPoint:

如果你必须遍历超级视图,我认为使用类似下面的功能会更安全一些。

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

但该功能仍然假定contentViewcell范围内,我在文档中也没有看到。

或许,最好的解决方案是重新架构您的代码,这样您就不需要从cell获取contentView,或者如果必须,那么从{的子视图添加实例变量{1}}至contentView

答案 1 :(得分:0)

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