我在原型单元格中有一个带有标签的UITextField
。 UITextField
被设置为在构建UITableView
并且打开上一个单元格中的UISwitch
时成为第一响应者。
如果应用程序从头开始或者已关闭并重新启动,则此方法有效。加载后,[tableView reloadData]
不会再触发becomeFirstResponder
。
如果UITextField
稍后通过触摸文本字段成为第一响应者,我可以使用按钮触发becomeFirstResponder
事件,弹出窗口,...
但不再使用我的开关了。
关于我可以尝试的任何指示?
目前,我使用didSelectRowAtIndexPath
方法触发弹出窗口。一个很好的副作用是,当我拉起数字键盘时,我可以在弹出窗口中提供一个确定和取消按钮,而不必在键盘上摆弄单独的按钮。但似乎很明显是一种解决方法。
这是我在构建UITableView
时调用firstresponder的方法(每次应用程序从头开始时都会有效):
if ([settings doubleForKey:@"limitDouble"]==0 && [settings boolForKey:@"limitBool"]==YES) {
[dailyLimitEntry becomeFirstResponder];
}
dailyLimitEntry是一个强大的UITextField
,所以它会一直存在。
为了好玩,我添加了一个按钮并将其连接到我的代码,如下所示:
UITextField *tmp = (UITextField *)[self.view viewWithTag:35];
[tmp becomeFirstResponder];
这也有效。当我将它与交换机一起使用时,只有在应用程序新加载到内存中时才会调用它。否则,我的UITextField
不响应切换。
在第一次评论之后,我找到了一种检查UITableView
是否已完成重新加载的方法
-(void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if([indexPath row] == ((NSIndexPath*)[[settingsTableView indexPathsForVisibleRows] lastObject]).row){
//end of loading
//for example [activityIndicator stopAnimating];
NSLog(@"finished reload");
NSLog(@"%@",dailyLimitEntry);
if ([settings boolForKey:@"limitBool"]==YES) {
UITextField *tmp = (UITextField *)[self.view viewWithTag:35];
[tmp becomeFirstResponder];
}
}
}
有趣的是,成为第一响应者只是在应用加载后第一次使用开关时触发。最初,开关关闭。因此,尚未绘制包含UITextField
的单元格。切换到ON
后,UITextField
将在第二个单元格中绘制并成为第一个响应者。如果我再次切换OFF
和ON
,我仍会将我的日志“完成重新加载”,但UITextField
不会成为第一响应者。这让我疯了......
必须与应用程序的生命周期有关。
答案 0 :(得分:2)
不是检查indexPath,而是检查单元格的类。
这就是我为标题单元格调出键盘所做的工作(当我创建一个新项目时):
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
if ([cell isKindOfClass:[FDSSampleTitleCell class]]) {
FDSSampleTitleCell *titleCell = (FDSSampleTitleCell *)cell;
if (titleCell.titleField.text.length == 0) {
[titleCell.titleField becomeFirstResponder];
}
}
}