UITableView单元格中的UITextField以编程方式成为FirstFirstResponder

时间:2012-10-18 22:44:18

标签: ios uitableview uitextfield cell becomefirstresponder

我在原型单元格中有一个带有标签的UITextFieldUITextField被设置为在构建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将在第二个单元格中绘制并成为第一个响应者。如果我再次切换OFFON,我仍会将我的日志“完成重新加载”,但UITextField不会成为第一响应者。这让我疯了...... 必须与应用程序的生命周期有关。

1 个答案:

答案 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];
        }
    }
}