【问题标题】:becomeFirstResponder very slow成为FirstResponder 非常慢
【发布时间】:2014-07-12 14:47:21
【问题描述】:

我有以下viewDidLoad 方法:

- (void)viewDidLoad {
    NSLog(@"didLoad");
    if (self.loginField.text.length > 0) [self.passwordField becomeFirstResponder];
    else [self.loginField becomeFirstResponder];
}

我还在viewWillAppearviewDidAppear 中添加了日志时间。

在某些情况下,推送动画需要很长时间。我已经用注释(和没有)if-else 行测量了时间(见:时间如下所示)。我不知道在viewWillAppearviewDidAppear 调用之间会降低我的应用程序的速度。

我试图用 Time Profiler (Instruments) 分析这段代码,但它什么也没显示。我不知道我该怎么做才能更快地展示我的观点。有什么想法吗?

使用 becomeFirstResponder,首先调用

2014-07-11 16:51:41.090 didLoad
2014-07-11 16:51:41.133 willAppear
2014-07-11 16:51:44.223 did appear
diffAppear = 3090ms

使用 becomeFirstResponder,第二次调用

2014-07-11 16:52:01.370 didLoad
2014-07-11 16:52:01.400 willAppear
2014-07-11 16:52:02.109 did appear
diffAppear = 709ms

不用 becomeFirstResponder,先调用

2014-07-11 16:57:21.720 didLoad
2014-07-11 16:57:21.754 willAppear
2014-07-11 16:57:22.420 did appear
diffAppear = 666ms

没有 becomeFirstResponder,第二次调用

2014-07-11 16:57:31.851 didLoad
2014-07-11 16:57:31.870 willAppear
2014-07-11 16:57:32.541 did appear
diffAppear = 671ms

【问题讨论】:

  • –becomeFirstResponser 通常会为需要时间的实际对象加载 输入视图。另一方面,您应该在 您的视图正确位于导航堆栈和视图层次结构中之后调用此方法,这意味着在这种情况下:in–viewDidAppear:方法之后,而不是更早。
  • 但是键盘不会立即出现
  • 是的,确实如此,但这不是一个好的做法,而且正如您所见 - 非常慢。
  • 也许这不是一个好习惯,但我的解决方案会立即显示键盘,并且在更快的设备(4s 及更高版本)上几乎不可见。
  • 如果速度在更快的设备上对您来说还可以,那么我不明白您的问题......较慢的设备显然比较快的兄弟设备执行相同的过程慢。你唯一能做的就是重新组织你的代码,找到一些平衡点,尽量不要对速度较慢的设备施加太大压力。

标签: ios objective-c uitextfield


【解决方案1】:

作为 cmets 中的 @holex 提及:

–becomeFirstResponser 通常会为 需要时间的实际对象。另一方面,你应该打电话 此方法在您的视图位于导航堆栈和 正确的视图层次结构,这意味着在这种情况下:在或之后 --viewDidAppear: 方法,不早了。

我将–becomeFirstResponser 移至-viewDidAppear:。现在根据这个question,我添加了这些观察者,如下所示,现在应该应用了。

- (void)willShowKeyboard:(NSNotification *)notification {
    [UIView setAnimationsEnabled:NO];
}

- (void)didShowKeyboard:(NSNotification *)notification {
    [UIView setAnimationsEnabled:YES];
}

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(willShowKeyboard:) name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didShowKeyboard:) name:UIKeyboardDidShowNotification object:nil];

这不是一个完美的解决方案(推送动画没有键盘)但对我来说已经足够了。

【讨论】:

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