当另一个button被按下时,执行当前的UITextField自动更正build议

我正在应用程序中实现聊天,与iPhone内置的消息应用程序非常相似。 我有一个button旁边的UITextField。 用户在文本字段中键入内容,文本字段经常提示各种自动更正。 在内置的消息应用程序中,点击发送button将导致当前可见的自动纠正build议执行。 我在我的应用程序中寻找这种行为,但一直没能find任何东西。

有没有人知道一种方式来编程方式执行UITextField当前可见的自动更正/自动完成的build议,当一个完全独立的控制被激活? 这显然是可能的。

在字段上调用-resignFirstResponder 。 这迫使它接受自动更正。 如果您不想closures键盘,可以立即再次调用-becomeFirstResponder

对于esilver:你可以做到这一点,而不必通过让不同的文本域成为FirstResponder,然后让相关的文本域成为FirstResponder而使第一响应者退出。 在这种情况下,键盘不会移动,并且不会触发任何隐藏通知。 如果您没有任何其他文本字段,请创build一个虚拟文本字段并将其设置为隐藏=是。

 -(void)tappedSendButton:(id)sender { // This hack is in place to force auto-corrections to be applied // before the text is sent. [self.dummyTextField becomeFirstResponder]; [self.toolbar.textView becomeFirstResponder]; [self sendChatWithBody: [self.toolbar.textView.text copy]]; } 

因为辞职和重新承担第一响应者可能有副作用(大量的通知,键盘显示/隐藏触发器等),我一直在寻找一种替代方式,不那么残酷的方式。 经过一番search之后,我发现这是你在UITextView (或者UITextField fwiw)中接受自动更正所需要做的一切:

 [textView.inputDelegate selectionWillChange: textView]; [textView.inputDelegate selectionDidChange: textView]; 

希望这可以帮助 ;)

这个代码在我的情况下解决了问题。

 [self.textView rejectAutoCorrect]; 

类别代码。

 @implementation UITextView (rejectAutoCorrect) - (void)rejectAutoCorrect { if ([self isFirstResponder]) { [self.inputDelegate selectionWillChange:self]; [self.inputDelegate selectionDidChange:self]; } } @end 

基于Nick Locking的build议,下面是我们编写的一个类别方法,用于在不closures键盘的情况下处理任何待定的自动更正build议(并且不会触发will / did hide /显示通知)。

 @implementation UITextView (SuggestionHelpers) - (void)acceptSuggestionWithoutDismissingKeyboard { // by making another UITextField the first responder, the keyboard won't try to hide UITextField *temp = [[[self class] alloc] initWithFrame:CGRectZero]; temp.hidden = YES; [[self superview] addSubview:temp]; [temp becomeFirstResponder]; [self becomeFirstResponder]; [temp removeFromSuperview]; } @end 

以下是讨论的解决scheme的简要回顾

创build一个虚拟textview使响应,然后返回到原来的textview。 确保它是第一响应者。

build立:

 self.textView = [[UITextView alloc] initWithFrame:self.view]; [self.view addSubview:self.textView]; self.dummyTextView = [[UITextView alloc] init]; [self.dummyTextView setHidden:YES]; [self.view addSubview:self.dummyTextView]; 

方法:

 - (void)commitSuggestions { if([self.textView isFirstResponder]) { [self.dummyTextView becomeFirstResponder]; [self.textView becomeFirstResponder]; } }