resignFirstResponder到不再在屏幕上的UITableViewCells上的UITextViews

时间:2011-02-15 07:11:15

标签: iphone objective-c uitableview uitextfield first-responder

我有一个UITableView,其中包含一大堆自定义UITableViewCells。其中每个UITableViewCells都包含UITextView

我遇到的问题是,如果用户触摸UITextView,则会成为第一个响应者并弹出键盘。如果用户然后向下滚动到屏幕上不再显示第一个应答器所在的UITableViewCell的位置,则无法通过UITextView将其解除。

我已经尝试持有(并保留)对UITextView的引用,但是一旦它离开屏幕并且我尝试访问它,我会得到EXC_BAD_ACCESS。无论我保留多少次都会发生这种情况,所以我怀疑它可能是直接调用dealloc(我不确定单元格出列系统是如何工作的)。

另一个奇怪的事情是,如果我滚动UITextField关闭屏幕,键盘仍可用于写入,当我滚动回UITextField时,键入的文本可见。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

Fluchtpunkt是绝对正确的,我没有正确地重新使用我的细胞。我的问题是我使用以下方法从笔尖加载我的自定义UITableViewCells:

static NSString *CellIdentifier = @"CustomCell";
ExpandingTableViewCell *cell = (ExpandingTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"ExpandingTableViewCell" owner:self options:nil];
    cell = (ExpandingTableViewCell *)[nib objectAtIndex:0];
}

我没有意识到我必须将自定义单元格的.xib文件中的Identifier字段设置为CustomCell。一旦我的单元格被正确地重新使用,UITextField在其时间消失之前就被解除了问题。

答案 1 :(得分:0)

您可以保存用户正在编辑的单元格的indexPath。然后,当他滚动测试该单元是否在tableView的可见单元格中时。如果没有从该单元格中获取文本字段并关闭键盘。

UITableViewCell *editingCell =  [self.tableView cellForRowAtIndexPath:SavedIndexPath];
[editingCell.textField resignFirstResponder];