按下另一个按钮时,执行当前的UITextField自动更正建议

时间:2011-01-06 03:42:58

标签: iphone ios uitextfield

我正在我的应用程序中实现聊天,非常类似于iPhone的内置消息应用程序。我在按钮旁边有一个UITextField。用户在文本字段中键入内容,并且文本字段通常表示各种自动更正。在内置的消息应用程序中,点击发送按钮将导致当前可见的自动更正建议执行。我在我的应用程序中寻找此行为,但无法找到任何内容。

当激活完全独立的控件时,是否有人知道以编程方式执行UITextField的当前可见自动更正/自动完成建议的方法?这显然是可能的。

6 个答案:

答案 0 :(得分:38)

在该字段上调用-resignFirstResponder。这迫使它接受自动更正。如果您不想关闭键盘,可以通过再次拨打-becomeFirstResponder来立即关注该键盘。

答案 1 :(得分:10)

对于esilver:你可以通过使用不同的文本字段firstFirstResponder然后让相关的文本字段成为第一个响应者而不通过第一个响应者来执行此操作。在这种情况下键盘不会移动,也不会触发任何隐藏通知。如果您没有任何其他文本字段,请创建一个虚拟文本字段并将其设置为hidden = YES。

-(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]];
}

答案 2 :(得分:6)

由于辞职和重新假设第一响应者可能有副作用(许多通知,键盘显示/隐藏触发器等),我一直在寻找一种替代的,不那么野蛮的方式。经过一番搜索后,我发现您需要做的就是接受UITextView(或UITextField fwiw)中的自动更正:

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

希望这会有所帮助;)

答案 3 :(得分:3)

此代码解决了我的问题。

@implementation UITextView (rejectAutoCorrect)

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

@end

类别代码。

stepnum = 123
formatted = format("//button([@id='step-%s']" % str(stepnum))

答案 4 :(得分:0)

基于Nick Locking的建议,这里是我们编写的类别方法,用于处理任何待处理的自动更正建议而不解除键盘(并且不触发意志/确实隐藏/显示通知)。

@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

答案 5 :(得分:-1)

以下是对所讨论解决方案的快速回顾......

创建一个虚拟文本视图以生成响应者,然后返回到原始textview。确保它是第一响应者。

<强>设置:

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];
    }
}