【问题标题】:How come UITextField calling becomeFirstResponder in viewDidAppear slows down the present animation?为什么 UITextField 在 vi​​ewDidAppear 中调用 becomeFirstResponder 会减慢当前动画的速度?
【发布时间】:2014-11-21 20:08:59
【问题描述】:

我正在展示来自另一个 UIViewController 的 UIViewController。呈现的视图控制器是这样实现 viewDidAppear 的:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.addressTextView becomeFirstResponder];
}

但是,如果我像这样实现 viewDidAppear:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.addressTextView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0f];
}

演示动画没有明显的延迟。

我的主要问题是,有没有人知道是否有另一种方法可以使文本字段成为第一响应者,而不会延迟我目前的动画?我不认为第二种解决方案是干净的。我依靠一些执行选择器如何工作的实现细节来获得我想要的功能。我宁愿不要。

我也很好奇为什么第一种方法会有这样的延迟,以及第一种方法与第二种方法“在幕后”有何不同。

编辑:可能值得注意的是,当前视图控制器动画中的延迟仅在第一次出现时发生。

【问题讨论】:

    标签: ios objective-c iphone animation


    【解决方案1】:

    这是一个已知问题。看看here

    要修复它,只需将其添加到您的 AppDelegate:

    UITextField *lagFreeField = [[UITextField alloc] init];
    lagFreeField.hidden = YES;
    [self.window addSubview:lagFreeField];
    [lagFreeField becomeFirstResponder];
    [lagFreeField resignFirstResponder];
    [lagFreeField removeFromSuperview];
    

    它将在应用程序启动时加载一个不可见的键盘,该键盘会缓存键盘并使其在随后的外观(即您的文本视图)中加载得更快。

    虽然这会修复它,但它会使您的应用程序加载速度变慢(甚至可能使您的应用程序崩溃,因为它需要很长时间)

    另一种选择是将 becomeFirstResponder 分派到主线程,这将使其在推送/模态动画完成后运行(基本上与您的第二个解决方案相同,但方式更简洁):

    dispatch_async(dispatch_get_main_queue(), ^(void){
      [self.adressTextView becomeFirstResponder];
    });
    

    我会选择第二个。

    无论如何回答你的第二个问题:

    -performSelector:withObject:afterDelay: 延迟 0.0 秒不会立即执行给定的选择器,而是在当前的 Runloop Cycle 完成和给定的延迟之后执行。

    因此,使用-performSelector:withObject:afterDelay: 时,UI 会在当前的 Runloop Cycle 中进行更新,即在这种情况下,视图在执行选择器之前被推送(并使您的 textView firstResponder 等),这使得一切顺利。

    来源:Apple Dev Docsthis Thread Answer

    希望我能提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多