Ios UITableViewCell的UITextField不是cellForRowAtIndexPath中调用的第一响应程序:

Ios UITableViewCell的UITextField不是cellForRowAtIndexPath中调用的第一响应程序:,ios,objective-c,uitableview,Ios,Objective C,Uitableview,我有一个UITableViewController,显示50个项目。这是一个普通的表视图,它使用value1单元格类型。当我点击一行时,我会向该单元格添加一个UITextField(它有一个明亮的绿色背景用于调试)。在这一点上,我还没有让它成为第一反应者。现在,如果我滚动表格视图,一切正常。正如人们所预料的那样,带有亮绿色文本字段的单元格将被排队并重新使用,并随机出现在其他单元格中 当我将该文本字段作为第一响应者时,发生了两件有趣的事情 我可以滚动一整天,而且这个单元永远不会被排队和重用 对于具

我有一个UITableViewController,显示50个项目。这是一个普通的表视图,它使用value1单元格类型。当我点击一行时,我会向该单元格添加一个UITextField(它有一个明亮的绿色背景用于调试)。在这一点上,我还没有让它成为第一反应者。现在,如果我滚动表格视图,一切正常。正如人们所预料的那样,带有亮绿色文本字段的单元格将被排队并重新使用,并随机出现在其他单元格中

当我将该文本字段作为第一响应者时,发生了两件有趣的事情

  • 我可以滚动一整天,而且这个单元永远不会被排队和重用
  • 对于具有作为第一响应者的文本字段的单元格,永远不会调用tableView:cellForRowAtIndexPath: 这就像是从游泳池中取出的细胞。一旦文本字段不是第一响应者,事情就会恢复正常

    以下是相关代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        NSLog(@"indexPath= %@", indexPath);
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier];
        }
    
        cell.textLabel.text =[NSString stringWithFormat:@"Label %@", self.items[indexPath.row]];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
        return cell;
    }
    
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
        [cell addSubview:self.textFieldForEditing];
        //[self.textFieldForEditing becomeFirstResponder];
    }
    
    我如何使文本字段成为第一响应者并不重要。无论是取消对didSelectRowAtIndexPath:中的行的注释,还是点击文本字段。不管怎样,都是同样的行为

    从某种角度来看,这种行为是方便的。为了防止文本字段出现在不应该出现的地方,没有必要实现出列管理代码


    但我在任何地方都找不到这种行为的记录。这正常吗

    是的,我认为这很正常。它有键盘焦点,因此对它有某种“强”引用,这可以防止它退出队列。