UITextView上的becomeFirstResponder无法正常工作

时间:2009-12-13 12:44:51

标签: iphone uikit uitextfield

出于某种原因,我在将文本字段作为第一响应者时遇到了麻烦。

我有两行的UITableView。每行都有一个标签和一个UITextField。文本字段标记为kLoginRowIndex = 0和kPasswordRowIndex = 1.正如您可能已经猜到的那样,我使用它来设置登录名和密码。

如果用户在编辑登录文本字段时点击返回按钮,我希望密码文本字段获得焦点。不幸的是,密码文本字段不接受焦点。这是我的代码:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    NSLog(@"%s:(textField.tag:%d)", __FUNCTION__, textField.tag);
    [textField resignFirstResponder];
    if(textField.tag == kLoginRowIndex) {
        UITableViewCell *cell = [self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:kPasswordRowIndex inSection:0]];
        UITextField *nextTextField = (UITextField *)[cell viewWithTag:kPasswordRowIndex];
        NSLog(@"(nextTextField.tag:%d)", nextTextField.tag);
        NSLog(@"canBecomeFirstResponder returned %d", [nextTextField canBecomeFirstResponder]);
        NSLog(@"becomeFirstResponder returned %d", [nextTextField becomeFirstResponder]);
    } else {
        [self validate:textField];
    }
    return NO;
}

这是日志输出:

-[SettingsViewController textFieldShouldReturn:]:(textField.tag:0)
(nextTextField.tag:1)
canBecomeFirstResponder returned 1
becomeFirstResponder returned 0

我尝试了什么:

  • 返回YES而不是NO
  • 删除对canBecomeFirstResponder的调用(仅用于调试目的)

任何提示都表示赞赏!

3 个答案:

答案 0 :(得分:10)

在玩了tmadsen的建议之后,我发现了错误。错误就是这一行:

UITableViewCell *cell = [self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:k

它返回一个新单元格,而不是当前屏幕上的单元格。我用

替换了它
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:kPasswordRowInde

现在它按预期工作。

另外,我发现0是标签属性的默认值,所以使用它可能不那么聪明。

答案 1 :(得分:3)

0是标记属性的默认值,因此您可能希望使用0以外的其他值,否则在调用viewWithTag时很可能会返回超级视图:

答案 2 :(得分:0)

自从我为iPhone开发以来已经有一段时间了,我从未使用过您在代码中显示的标签。但是你可以通过制作类的textfields属性来做你想做的事。如果你这样做,让我们说你将这些属性命名为loginTextField和passwordTextField,那么你可以让下一个textField聚焦如下:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    if([self usernameTextField] == textField) {
        return [[self passwordTextField] becomeFirstResponder];
    }
    else {
        // your validating code...
    }

    return NO;
}

但正如我所说,已经有一段时间了,我不知道这个标签 - 你谈到的事情,所以也许这是一些新的最佳实践,但上面的代码应该正常工作