首页 文章

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

提问于
浏览
26

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

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

6 回答

  • 6

    这个代码解决了我的问题 .

    [self.textView rejectAutoCorrect];
    

    类别代码 .

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

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

  • 3

    对于esilver:你可以通过使用不同的文本字段firstFirstResponder然后让相关的文本字段成为FirstResponder来在不重新响应第一响应者的情况下执行此操作 . 在这种情况下键盘不会移动,也不会触发任何隐藏通知 . 如果您没有任何其他文本字段,请创建一个虚拟文本字段并将其设置为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]];
    }
    
  • 10

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

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

    希望这可以帮助 ;)

  • 38

    基于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
    
  • -1

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

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

    setup:

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

    Method:

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

相关问题