如何以编程方式将键盘视图从“符号”重置为“字母”

时间:2011-07-19 14:37:20

标签: iphone objective-c uitextview

我有一个UITextView,我正在听一个UIButton事件来对这个textView中的文本采取行动:

- (IBAction)buttonClicked {
    NSString *text = myTextView.text;
    //Do some work with the text.
    myTextView.text = @""; //reset the textView.
}

我不希望textView为resignFirstResponder。我面临的问题是:当最后输入的字符是符号时,键盘卡在该视图上,并且不会重置为默认键盘字母视图,消息应用程序和其他应用程序中的行为也是如此。如何以此方法以编程方式重置键盘?

这可能是this question的重复问题。但答案对我来说似乎没有用。

这是接受的答案:

[editingField setKeyboardType:UIKeyboardTypeNumberPad];
[editingField reloadInputViews];

这是最后一条评论:

  

好的,显然将其声明为UITextView而不是UIResponder会影响它在运行时的行为方式。这实际上是我所做的唯一改变,它现在有效。感谢。

但我似乎无法理解使其发挥作用的微小变化是什么,因为我仍然在努力解决这个问题。

我已经尝试了resignFirstResponderbecomeFirstResponder,但是在快速连续中,后面的scrollableView不是根据keyboardWillShow事件设置的。我也试过[textView setKeyboardAppearance:UIKeyboardAppearanceDefault],但仍然没有变化。

是否有任何API方法可以执行此操作(例如键盘在自动点击'空格'时重置)?

3 个答案:

答案 0 :(得分:2)

我使用的hack是使用隐藏的textField来重新加载inputView。

代码:

UITextField *hiddenTextField = [[UITextField alloc] init];
[superView addSubview:hiddenTextField];

[hiddenTextField becomeFirstResponder];
[hiddenTextField reloadInputViews];
[textView_ becomeFirstResponder];

[hiddenTextField removeFromSuperview];
[hiddenTextField release];

答案 1 :(得分:1)

我不使用临时文本字段。我只是在文本视图中resignFirstResponder并立即becomeFirstResponder。如果两个调用一个接一个地立即完成,则不会发生键盘滑动动画。

所以我的buttonClicked函数看起来像这样:

- (IBAction)buttonClicked {
    NSString *text = myTextView.text;
    //Do some work with the text.
    myTextView.text = @""; //reset the textView.

    // Reset keyboard back to QWERTY side
    [myTextView resignFirstResponder];
    [myTextView becomeFirstResponder];
}

作为旁注,不幸的是,即使没有动画发生,键盘通知(例如UIKeyboardWillShowNotificationUIKeyboardWillHideNotification等)仍会被调用。我只是在resignFirstResponder之前设置一个标志来通知我的键盘隐藏/显示通知回调以跳过执行。在我becomeFirstResponder之后,我清除了那个标志,所以当键盘确实滑开时,通知回调可以正常执行。

答案 2 :(得分:0)

self.textField.keyboardType = UIKeyboardTypeAlphabet;
[self.textField reloadInputViews];