当另一个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]; } }