代码之家  ›  专栏  ›  技术社区  ›  Daniel Hepper

UIExtView上的BecomeFirstResponder不工作

  •  3
  • Daniel Hepper  · 技术社区  · 15 年前

    出于某种原因,我无法让文本字段成为第一响应者。

    我有一个两行的视图。每行都有一个标签和一个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

    我的尝试:

    • 返回“是”而不是“否”
    • 正在删除对CanBecomeFirstResponder的调用(仅用于调试目的)

    感谢您的任何提示!

    3 回复  |  直到 15 年前
        1
  •  10
  •   Daniel Hepper    15 年前

    在听了Tmadsen的建议后,我发现了错误。错误是这一行:

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

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

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

    现在它按预期工作。

    另一方面,我发现0是标记属性的默认值,所以使用它可能并不明智。

        2
  •  3
  •   jessecurry    15 年前

    0是标记属性的默认值,因此您可能希望使用0以外的其他值,否则在调用viewwithtag:

        3
  •  0
  •   tmadsen    15 年前

    我已经有一段时间没有为iPhone开发过了,我从来没有使用过你在代码中显示的标签。但是您可以通过创建类的textfields属性来完成您想要的工作。如果您这样做,假设您将这些属性命名为logintextfield和passwordtextfield,那么您可以让下一个textfield集中如下:

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

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