3

UITextField在原型单元格中有一个带有标签的标签。当正在构建并且打开上面单元格中的aUITextField时,将设置为第一响应者。如果应用程序从头开始或已关闭并重新启动,则此方法有效。一旦加载,就不会再触发了。UITableViewUISwitch[tableView reloadData]becomeFirstResponder

如果UITextField稍后通过触摸文本字段成为第一响应者,我可以becomeFirstResponder使用按钮、弹出窗口等触发事件……但不再使用我的开关。

关于我可以尝试什么的任何指示?

目前,我使用该didSelectRowAtIndexPath方法触发弹出窗口。一个很好的副作用是,当我拉起数字键盘时,我可以在弹出窗口中提供一个确定和取消按钮,而不必摆弄键盘上的单独按钮。但这似乎很明显是一种解决方法。

这就是我在构建时调用 firstresponder 的方式UITableView(每次应用程序从头开始时都有效):

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尚未绘制。一旦我切换到ONUITextField就会在第二个单元格中绘制并成为第一响应者。如果我再次切换OFFON我仍然会得到我的日志“完成重新加载”,但UITextField不会成为第一响应者。它让我发疯......一定是关于应用程序的生命周期的东西。

4

1 回答 1

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];
        }
    }
}
于 2013-06-14T16:05:09.867 回答