0

我有一个自定义 UITableViewCell (子类),效果很好。单元格的一部分是 UITextField,我将其作为@property 对外公开。但是,所有内容都在单元格内部进行管理,包括在 initWithStyle 函数中分配 + 设置 UITextField。

我注意到的是,当我创建一个大小合适的表格(比一次在页面上显示的单元格多)然后选择一个 UITextField 的,键入一点,最后向下滚动并选择另一个单元格时,我的程序崩溃了。

当我执行以下操作时,我的程序不会崩溃

  • 重复上述步骤减去输入原始单元格
  • 输入 UITextField,然后滚动并输入 close by 文本字段。
  • 直接跳到任何特定的文本字段并开始输入

现在,我目前没有重复使用单元格,但是一旦所有的错误都出来了。

查看崩溃堆栈,这似乎正在发生,因为程序正试图让原始文本字段的第一响应者辞职。此文本字段是否被意外释放?我不这么认为,因为我可以选择一个单元格,滚动离开屏幕,开始输入,然后一直向上滚动并查看我刚刚输入的内容。内部 *textfield 指针是否已更改?它不应该是我只在重载的 UITableViewCell 的 initWithStyle:reuseIdentifier: 函数中分配给它的——即使是这样,辞职的不是我;我什至没有在我的代码中的任何地方调用 resignFirstResponder 。

那么有没有一种方法可以识别我的 UIView(例如 UITableViewCell)是否已经滚动到屏幕外(从 UITableViewCell 中——最好是通过重载某些方法)?我想到了 viewDidUnload,但那是针对 viewControllers 的。如果我有这样的方法,我会利用它在文本字段上 resignFirstResponder 以及我想要处理的任何其他处理。

一些代码:

// In the .h
@interface mycell:UITableViewCell <UITextFieldDelegate>;
@property (nonatomic, retain) UITextField *textfield;
@end

// In the .m
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuse];
    if (!self) return self;

    self.textfield = [[UITextField alloc] initWithFrame:CGRectZero];
    [self.textfield setDelegate:self];
    [self addSubview:self.textfield];
    return self;
}

欢迎提出建议。

4

0 回答 0