当iOS使用硬件键盘时,按Tab键或shift-tab会分别自动导航到下一个或上一个逻辑响应器。有没有办法以编程方式执行相同操作(即模拟Tab键而不是手动跟踪逻辑顺序)?
答案 0 :(得分:9)
由于 William Niu 是对的,但您也可以使用下面介绍的代码。
我已经使用过这个并获得了成功。现在考虑UITextField的例子......
您可以使用UITextView的委托方法-(BOOL)textFieldShouldReturn:(UITextField*)textField
,如下所述。
但是在执行此操作之前,您必须以递增顺序为每个UITextField提供标记...(不需要递增顺序,但是对于我的代码它是必需的,您也可以使用递减顺序但是一些代码更改这样做)
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSInteger nextTag = textField.tag + 1;
UIResponder* nextResponder = [self.view viewWithTag:nextTag];
if (nextResponder) {
[nextResponder becomeFirstResponder];
} else {
[textField resignFirstResponder];
}
return YES;
}
希望这对你有用......
快乐的编码......
答案 1 :(得分:4)
您可以使用tag属性定义“tab-order”。以下文章介绍了如何查找要转到UITextField
s的下一个标记索引,
How to navigate through textfields (Next / Done Buttons)。
以下是该帖子的修改版代码。以下代码将尝试循环回到第一个标记索引,而不是在最后一个标记索引处删除键盘。
-(BOOL)textFieldShouldReturn:(UITextField*)textField;
{
NSInteger nextTag = textField.tag + 1;
// Try to find next responder
UIResponder* nextResponder = [textField.superview viewWithTag:nextTag];
if (nextResponder) {
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
return NO;
}
// Try to find the first responder instead...
// Assuming the first tag index is 1
UIResponder* firstResponder = [textField.superview viewWithTag:1];
if (firstResponder) {
// loop back to the first responder
[firstResponder becomeFirstResponder];
} else {
// Not found, so remove keyboard.
[textField resignFirstResponder];
}
return NO; // We do not want UITextField to insert line-breaks.
}
如果你想要一个除UITextField
以外的UI元素,你仍然应该能够使用相同的逻辑,并进行更多检查。
答案 2 :(得分:0)
不确定这是否有帮助,但在UITextFields的上下文中,如果实现UITextFieldDelegate
,则在按下软键盘的返回键时将调用- (BOOL)textFieldShouldReturn:(UITextField *)textField
。
我试图直接点击我的笔记本电脑键盘,它似乎按照你将它们添加到视图中的顺序在所有文本字段之间跳转,但没有转到任何其他类型的字段(按钮)等)。
键盘上的键模拟了模拟器软键盘上的按键,按预期工作。