我有一个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;
}
。使用它有什么方法可以使它工作吗?或者,如果我想让它成为第一个响应者,我每次都必须创建一个新的单元格吗?但是,创建如此多的单元格似乎非常糟糕。
答案 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];
}
}
}
}