繁体   English   中英

UITableViewCell:在dealloc中将UITextField委托设置为nil

[英]UITableViewCell: Set UITextField delegate to nil in dealloc

我有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,但是由于我很偏执,我怀疑可能出现以下情况:用户点击“返回”按钮,因此调用了view controller dealloc dealloc我的view controller释放了它的表视图,但是tableView以及所有文本字段现在仍然存在。 如果此时某种文本字段之一将其称为委托方法,则应用程序将崩溃,因为委托不再是有效的对象。

如果有人可以解释为什么无法实现这种情况,那么它将使我确信我不需要将委托设置为nil。

您不需要这样做。 所有单元也将被释放,因此它们将没有对委托的引用。

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

我不希望将此答案标记为已接受,但这不适合在评论窗口中显示。

因此,您可以启动探查器,而不是我们试图说服您,而是可以为iOS开发人员启动最重要的工具之一。 并通过使用该界面亲自查看,分配的单元格数目应该保持不超过分配的数量,然后单击时,所有的单元格都将被释放。

如果不是,则它们可能对其他内容有很强的引用,但是可以使用探查器轻松检测到。

我还想补充一点,在处理单元格时,滚动UITable的动作是,再次点击回车进入表,再次点击回滚(至少重复10次),这是检测内存泄漏的强制性做法。

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

nameTextField.tag = TEXT_FIELD_TAG;

考虑到您有多个具有相同标签的单元格,因此您不能简单地调用所需的单元格。 我记得规则是第一个放在屏幕上“赢得” TAG(或类似)的规则。

[UPDATE]

只是一个猜测,我从未证明过这一点,但请继续讨论这个问题,如果您的问题是首先拥有一个单元用于UITextView,是否尝试过循环主视图而忽略该单元:

UITextView textView = [mainView viewWithTag:TEXT_FIELD_TAG];
while(textView!=nil){ // or whatever loop or criteria you like
   // deallo, nil, etc...
   textView = [mainView viewWithTag: TEXT_FIELD_TAG];
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM