iOS UITextField不能多次成为FirstResponder

时间:2013-06-10 07:22:19

标签: ios objective-c textfield becomefirstresponder

我有一个UITableView部分,当您点按某个部分时,该部分会展开并有可供选择的选项,或者您可以通过其中一个UITextField插入您自己的选项{1}}。对于该单元格,我在UITableViewCells中使用此代码来配置自定义单元格并设置第一个响应者。

tableView: cellForRowAtIndexPath:

数据字段是 DataAddTVCell *dataInputcell = (DataAddTVCell *)cell; dataInputcell.data.delegate = self; self.dataTextfield = dataInputcell.data; [self.dataTextfield becomeFirstResponder]; 。我将UITextField保存在self.dataTextField中,以便我以后可以UITextField

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

UITextFieldDelegate

我怀疑这种情况正在发生,因为我正在使用- (BOOL)canBecomeFirstResponder { return YES; } - (BOOL)becomeFirstResponder { return YES; } 。使用它有什么方法可以使它工作吗?或者,如果我想让它成为第一个响应者,我每次都必须创建一个新的单元格吗?但是,创建如此多的单元格似乎非常糟糕。

1 个答案:

答案 0 :(得分: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];
                        }
                    }
                }
            }