我有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。
答案 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(或类似的东西)来知道单元格的位置。如果您有兴趣告诉我它并将复制一些代码。