becomeFirstResponder不尊重键盘设置

时间:2009-07-31 19:09:56

标签: iphone objective-c xcode uitextfield

我正在研究一个相当简单的iPhone应用来解决二次方程,主要是因为它很容易 - 至少是概念和数学!

我在Interface Builder中创建了一个界面,它有几个标签,3个文本字段(varAfield等)和一个Solve按钮。设置为UITextFieldDelegate的3个文本字段已设置为自动显示“数字和标点符号”键盘。 此代码用于关闭键盘,然后当用户点击返回键时自动移动到下一个变量(除了表示“完成”的变量C之外,显示“下一个”

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
if (theTextField == varAfield) {
    [varAfield resignFirstResponder];
    [varBfield becomeFirstResponder];
}
if (theTextField == varBfield) {
    [varBfield resignFirstResponder];
    [varCfield becomeFirstResponder];
}
if (theTextField == varCfield) {
    [varCfield  resignFirstResponder];
}
return YES;
}

无论如何,问题出现在firstFirstResponder的第一个实例中。键盘按原样出现,然而,它使用的是ASCII键盘而不是“数字和标点符号”。第二次调用它时,它可以正常工作。此外,如果我再次从变量A开始它将正常工作。无论我在哪里移动第一个实例的becomeFirstResponder,它是在应用程序中调用的第一个(也是唯一的第一个)时间,它的行为都不正确。

更新:仍然成为第一个响应者(甚至在第一个实例上)尊重我选择的返回键,但无论设置哪个键盘,它仍然显示“ASCII Capable”。发生什么了?我已经检查了IB中的所有内容,看起来没问题......

2 个答案:

答案 0 :(得分:4)

我可以确认这只发生在设备上,而不是在模拟器中。我可以在v2.2.1,3.0和3.1中复制此行为。

如果您有一堆文本字段,并通过调用textFieldShouldReturn中的becomeFirstResponder将它们链接在一起,如上例所示,并且所有字段都设置为键盘类型UIKeyboardTypeNumbersAndPunctuation,对于每个SECOND字段,键盘将更改为UIKeyboardTypeASCIICapable

我已经尝试过显式设置setKeyboardType:UIKeyboardTypeNumbersAndPunctuation,但没有区别。

有趣的是,只有在以编程方式调用becomeFirstResponder时才会发生这种情况。如果用户直接单击文本字段,则键盘会正确显示。

更有趣的是,如果你查看调试器中的keyboardType属性,它仍然设置为UIKeyboardTypeNumbersAndPunctuation,即使界面上显示了ASCII键盘。

它发生的原因是因为ASCII和数字键盘是同一视图的不同模式。

键盘上“下一个”/“返回”键的默认操作包括从数字视图交换回字母表视图,这就是这里发生的事情。

修复:从textFieldShouldReturn返回NO以防止发生默认行为。

答案 1 :(得分:0)

您是否尝试过首先在其他视图上调用becomeFirstResponder,这样当您在文本字段上调用它时,这不是第一次?

顺便说一下,前两个resignFirstResponder是多余的。它们甚至可能是导致漏洞泄露的原因。