0

我有一个UITableViewwith 部分,当您点击一个部分时,该部分会展开并且有可供选择的选项,或者您可以通过UITextField其中一个中的a 插入您自己的选项UITableViewCells。对于那个单元格,我有这段代码tableView: cellForRowAtIndexPath:来配置自定义单元格并设置第一响应者。

        DataAddTVCell *dataInputcell = (DataAddTVCell *)cell;
        dataInputcell.data.delegate = self;
        self.dataTextfield = dataInputcell.data;
        [self.dataTextfield becomeFirstResponder];

数据字段是UITextField. 我保存UITextField在 self.dataTextField 中,以便resignFirstResponder以后可以。

第一次DataAddTVCell从我的部分加载和扩展时,它工作正常并成为第一响应者。辞去第一响应者的职务也有效。但是,当另一个部分展开时再次加载单元格时,它不会成为第一响应者。如果我点击textField,键盘显示正常,我可以像以前一样让第一响应者辞职。不知道为什么 textField 只能成为第一响应者一次。我也有这些委托方法并设置了 < UITextFieldDelegate>

- (BOOL)canBecomeFirstResponder
{
    return YES;
}

- (BOOL)becomeFirstResponder
{
    return YES;
}

我怀疑这是因为我正在使用dequeueReusableCellWithIdentifier. 有没有办法让它在使用它时工作?或者,如果我希望它在显示时始终成为第一响应者,我是否每次都必须创建一个新单元格?不过,总是创建这么多细胞似乎很糟糕。

4

1 回答 1

0

发生这种情况是因为每次加载单元格时,都会重新创建它以及它的子视图。因此,对您的文本字段的引用会丢失。要成功辞职,您需要保持关注父单元格以避免重新创建单元格。

编辑

另一种选择是您记住单元格的索引路径,即您想成为第一响应者的文本字段。在该索引路径上创建单元格时,遍历其子视图,捕获文本字段的引用并调用becomeFirstResponder它。

你需要做我上面提到的同样的事情。在cellForRowAtIndexPath:适当的位置编写以下代码:

 if(indexPath.section == 0)//your section in which that cell is present. e.g. 0
            {
                if(indexPath.row == 1)//cell no. 1
                {
                    if(showingInputCell)//flag to keep track either it is textfield cell or other
                    {
                        for (UIView * subview in cell.subviews) {
                            if([subview isKindOfClass:[UITextField class]])
                                [(UITextField *)subview becomeFirstResponder];
                        }
                    }
                }
            }
于 2013-06-10T07:31:27.717 回答