UITableViewCell:在dealloc

时间:2015-04-27 13:25:03

标签: ios objective-c uitableview

我有UITableView个单元格中包含一个UITextField。我的UITableViewController是所有这些文本字段的代表。现在,当UITableViewController被取消分配时,我想将所有文本字段的委托设置为nil。文本字段有一个标记,所以一旦我有了一个单元格,我就可以用它来标记它。

问题是如何获得所有创建的细胞?询问UITableView visibleCells只返回可见的单元格,但可能会发生,有一行不可见,它仍然将UIViewController作为委托。所以我真的需要以某种方式获得所有创建的细胞。 cellForRowAtIndexPath做同样的事情,所以它也不适合我。我在这里看到的唯一方法是将所有文本字段存储在数组中,但可能有更好的方法吗?

以下是一些代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:@"reuseId"];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"reuseId"];
        UITextField *nameTextField = [[UITextField alloc] initWithFrame:nameTextFieldRect];
        nameTextField.tag = TEXT_FIELD_TAG;
        nameTextField.delegate = self;
        [cell.contentView addSubview:nameTextField];
    }
    return cell;
}

-(void)dealloc
{
    // todo: get all text fields and set theirs delegate to nil
}

好吧,大多数答案表明我不需要将委托设置为nil,但由于我是偏执狂,我怀疑以下情况是可能的: 用户点击'返回'按钮,因此dealloc的{​​{1}}被调用。在view controller我的dealloc发布了它的表格视图,但此时view controller仍然存在,以及所有文本字段。如果此时某个文本字段会调用它的委托方法,则app会崩溃,因为委托不再是有效对象。

如果有人可以解释为什么这种情况不可能,那么就会让我相信我不需要将委托设置为nil。

3 个答案:

答案 0 :(得分:6)

你不需要这样做。所有单元格也将被释放,因此它们不会引用该委托。

默认情况下,delegate是弱引用,因此它不会保留您的对象。

答案 1 :(得分:0)

我不希望将此答案标记为已接受,但这不符合评论窗口。

所以,不是我们试图说服你,你可以启动iOS开发人员最重要的工具之一,即开发人员。通过使用您应该获得的界面来自己看看,只需要分配填充屏幕所需的单元格数量,然后当您点击回来时,所有这些都将被取消分配。

如果不是,他们可能会强烈引用其他内容,但这可以通过分析器轻松检测到。

我还想补充一点,当使用单元格滚动UITable时,再次点击返回表格,向后滚动(重复至少10次)这是检测内存泄漏的强制性做法。

另外,我不知道将标签分配给单元格的目的,我可能错了但是这个:

Int

考虑到您有多个具有相同标签的单元格,因此您无法简单地回想起所需的单元格。我记得规则是第一次在屏幕上'赢'TAG(或者那种)。

<强> [UPDATE]

只是一个猜测,我从来没有证明这一点,但是要坚持这个问题,如果你的问题是首先拥有一个单元格来获取UITextView,你是否尝试循环主视图并忽略单元格:

nameTextField.tag = TEXT_FIELD_TAG;

答案 2 :(得分:-1)

为该单元格创建一个新的委托/协议,并在视图控制器中实现该委托,如PersonTableViewCellDelegate。除此之外,您的单元格实现了UITextField委托,并在该代码中调用[self.delegate onKeyPressed]或其他任何内容。我建议你也传递一个单元格的引用,所以在视图控制器中你可以使用indexPathFromCell(或类似的东西)来知道单元格的位置。如果您有兴趣告诉我它并将复制一些代码。