出于某种原因,我在将文本字段作为第一响应者时遇到了麻烦。
我有两行的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
我尝试了什么:
任何提示都表示赞赏!
答案 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;
}
但正如我所说,已经有一段时间了,我不知道这个标签 - 你谈到的事情,所以也许这是一些新的最佳实践,但上面的代码应该正常工作