【问题标题】:iOS - UITextView becomeFirstResponderiOS - UITextView 成为FirstResponder
【发布时间】:2012-01-06 07:24:36
【问题描述】:

这是问题所在:当 MessageComposeViewController 被解除时,我的 textView 没有成为第一响应者并且键盘没有出现。为什么?我将[textView becomeFirstResponder] 代码放在viewWillAppear 中。我该怎么办??

【问题讨论】:

  • 几个标准问题:viewWillAppear 在 MessageComposeViewController 被解除后会被调用吗? textView 不为空吗?
  • @MichaelDautermann textView 不为空,我敢肯定,但我怎么知道在关闭消息控制器后是否调用了 viewWillAppear?
  • 设置断点,看看是否命中。
  • 或添加NSLog(@"foo")(但请参阅下面的答案)
  • @jon nslog 打印正确的值

标签: ios uitextview becomefirstresponder


【解决方案1】:

您的问题不是特别清楚,但您假设当模态视图控制器(我假设您称为 MessageComposeViewController)被解除时会调用 viewWillAppear。在所有情况下都可能不是这样(例如,如果您的视图位于 UINavigationController 内)

有很多方法可以处理这个问题,但也许最简单的方法是将您的 MessageComposeViewController 引用传递给您的原始视图控制器并调用一个方法使您的 UITextField 成为第一个响应者。

【讨论】:

  • 我认为 viewWillAppear 在模态视图被关闭时被调用。当您说传递对 MessageComposeViewController 的引用时,我不明白您的意思。我该怎么做?
  • 看看这个问题,了解viewWillAppear 可能被调用和可能不被调用的示例:stackoverflow.com/questions/131062/… 如果这些都不起作用,那么我可以提供一些代码示例,但最简单的方法是在 MessageComposeViewController 上创建一个实例变量和属性,在初始化后会返回对原始视图控制器的引用。
  • MessageViewController 是默认控制器,如何在其上创建属性?
【解决方案2】:

我找到了解决办法!!!!!!!!! 所以,在messageComposeViewController:didFinishWithResult 委托方法中我们调用[self dismissModalViewControllerAnimated:YES],但这是错误的!此方法应收到 NO,而不是 YES!然后回想[textView becomeFirstResponder] 方法!我不知道为什么,但是通过这种方式,该应用程序可以完美运行! 不过谢谢大家! :)

【讨论】:

  • 评论为什么这被标记会很可爱。
  • 我唯一能想到的就是使用 viewDidAppear,所以它以正确的顺序发生。
【解决方案3】:

我稍后通过这行调用了 becomeFirstResponder:

[self.searchBar performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.1f];

它对我有用。希望对您有所帮助。

我猜是动画的原因。

【讨论】:

  • 如果我太快调用 becomeFirstResponder,我也会遇到视图被掩盖的问题。我将延迟更改为 0.0f 并在 viewDidAppear 中调用了上面的行,然后就解决了问题。如果在事情仍在变化时调用它,似乎会感到困惑。
【解决方案4】:

我或多或少有同样的问题,它与 segue 处的动画有关,它看起来像在不使用 resignFirstResponder 的情况下进行 segue o 关闭视图破坏与视图的关系,我只是将 segue 修改为这样做像这样以编程方式:

  - (IBAction)back:(id)sender {

     [textView resignFirstResponder];
     [self performSegueWithIdentifier:@"returnScreen" sender:self];
  }

然后在 viewWillAppear 我做了下一个:

 -(void)viewWillAppear:(BOOL)animated{
     [super viewWillAppear:animated];
     [textView becomeFirstResponder];

  ....

  }

【讨论】:

    【解决方案5】:

    根据official Apple documentation 的注释:

    在将对象指定为第一响应者之前,请确保您的应用已建立其对象图。例如,您通常在 viewDidAppear: 方法的覆盖中调用 becomeFirstResponder 方法。如果您尝试在 viewWillAppear: 中分配第一响应者,则您的对象图尚未建立,因此 becomeFirstResponder 方法返回 NO。

    您应该在viewDidAppear: 中调用[textView becomeFirstResponder] 而不是viewWillAppear:

    您使用[self dismissModalViewControllerAnimated:NO] 找到的解决方案似乎使用了注释中的相同规则。

    【讨论】:

      【解决方案6】:

      迅速

      let when = dispatch_time(DISPATCH_TIME_NOW, Int64(0.1 * Double(NSEC_PER_SEC)))
          dispatch_after(when, dispatch_get_main_queue()) {
              self.searchBar.becomeFirstResponder()
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多