【问题标题】:Keyboard not showing after MFMessageComposeViewControllerMFMessageComposeViewController 后键盘不显示
【发布时间】:2011-01-22 14:38:35
【问题描述】:

在一个 iPhone 应用程序中,我有一个 UITextView 和一个按钮,它允许用户将 UITextView 的内容作为文本消息发送。代码如下所示:

MFMessageComposeViewController *picker = [[MFMessageComposeViewController alloc] init];
picker.messageComposeDelegate = self;

picker.body = textView.text;

[self presentModalViewController:picker animated:YES];

一切正常,除了发送消息或在MFMessageComposer 中点击取消:UITextView 的键盘不再显示,即使光标闪烁

我尝试了一些方法,包括按钮代码中的 [textView resignFirstRepsonder]-viewDidDisappearMFMessageComposeViewControllerDelegate 方法中的 [textView becomeFirstResponder]-viewDidAppear 也没有改变任何东西......

有什么想法吗?

【问题讨论】:

  • 我不知道,Apple 也是这样做的(参见MessageComposer 示例)...

标签: iphone objective-c keyboard


【解决方案1】:

我也遇到了同样的问题,只好接受fabian的解决方案,但发现通过调用[self dismissModalViewControllerAnimated:NO]然后调用[textView becomeFirstResponder],我可以让键盘重新出现。关于动画的某些东西搞砸了键盘。看起来像是 iOS 4.2 中的一个错误。

【讨论】:

  • 起初我错过了应该将动画设置为 NO,但现在它也适用于我。
  • 我遇到了完全相同的问题并将 Animated 设置为 NO 解决了它。感谢您发布答案。
【解决方案2】:

视图消失后,您需要让视图成为第一响应者。将 MFMessageComposeViewControllerDelegate 协议添加到您的标头中,然后使用以下内容:

- (void)messageComposeViewController:(MFMessageComposeViewController *)controller didFinishWithResult:(MessageComposeResult)result{
    [self dismissModalViewControllerAnimated:YES];
    [self becomeFirstResponder];
}

编码愉快,

赞恩

【讨论】:

  • 在方法中设置一个断点,然后仔细检查它是否真的在触发。如果是,请尝试添加另一个文本字段。你的按钮是否响应触摸?
  • 我已经在委托中设置了一个断点,它会被调用。该按钮也可以工作,因为显示了MessageComposer
  • 这是一个非常奇怪的问题。尝试在视图中的其他位置添加另一个文本字段,看看是否可以编辑它。
【解决方案3】:

我遇到了类似的问题,并且在稍有延迟后通过调用 becomeFirstResponder 来解决它:

[textField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.01];

【讨论】:

    【解决方案4】:

    延迟技巧还解决了在 MFMessageComposeViewController 完成后立即显示 UIAlert 后缺少文本光标的问题,但是延迟需要更长的时间(在我的情况下为 0.5 秒)

    【讨论】:

      【解决方案5】:

      我找不到更好的解决方案,所以这是我的解决方法:

      - (void) actionSheet:(UIActionSheet *)actionSheet 
      willDismissWithButtonIndex:(NSInteger)buttonIndex
      

      我关闭键盘并进入

      - (void) actionSheet:(UIActionSheet *)actionSheet 
      didDismissWithButtonIndex:(NSInteger)buttonIndex`
      

      我提出MFMessageComposeViewController

      - (void)messageComposeViewController:(MFMessageComposeViewController *)controller 
                   didFinishWithResult:(MessageComposeResult)result
      

      [textView becomeFirstResponder],因为它不起作用。它在viewDidAppear: 中也不起作用。用户必须再次点击UITextField

      不是一个很好的解决方案,但我发现的唯一一个......

      【讨论】:

        【解决方案6】:

        从 iOS 5 开始,这是一种解决方法。在呈现 MFMessageComposeViewController 实例之前,请先退出 UITextView 上的第一响应者:

        [self presentViewController:messageComposer animated:YES completion:NULL];
        [textView resignFirstResponder];
        

        然后在委托方法messageComposeViewController:didFinishWithResult: 中这样做:

        [controller dismissViewControllerAnimated:YES completion:^{
          [textView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
        }];
        

        这为我解决了消失的键盘问题。无需永久关闭键盘。

        【讨论】:

          【解决方案7】:

          如果在 modal VC 之前显示的 viewController 是导航控制器的子级,则不会出现此行为。所以解决方案是制作假 UINavigationController 并将您的 VC 控制器添加到导航控制器。

          【讨论】:

            猜你喜欢
            • 2016-09-14
            • 2012-12-02
            • 2012-06-03
            • 2019-03-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多