解除键盘时-endEditing与条件的性能

时间:2014-01-02 21:02:01

标签: ios objective-c performance uitextfield

在后台点按中关闭键盘时,我通常会在我的根视图中添加一个点击手势识别器并将其连接到dismissKeyboard: IBAction,这可以使用以下任一方法实现:

// Method 1

- (IBAction)dismissKeyboard:(id)sender
{
  [self.view endEditing:YES];
}

OR

// Method 2

- (IBAction)dismissKeyboard:(id)sender
{
  if ([self.firstNameTextField isFirstResponder]) {
    [self.firstNameTextField resignFirstResponder];
  }
  else if ([self.lastNameTextField isFirstResponder]) {
    [self.lastNameTextField resignFirstResponder];
  }
  // And so on for all UITextFields in the view
}

虽然第一种方法很方便,但我很好奇是否由于性能命中,Apple建议的最佳做法或其他原因而不太理想。第二种方法虽然相当冗长,但只检查您明确提供的子视图,并在找到要重新签名的文本字段后返回。由于这些原因,它仍然看起来像一个吸引人的选择。

2 个答案:

答案 0 :(得分:2)

我今晚对这两种辞职第一响应者的方法之间的差异进行了性能测试。

对于第一个测试,我分配并初始化了4000个UITextField,并将它们作为子视图添加到UIViewController中的主视图中。然后我将其中一个UITextField作为firstResponder,然后获取当前的NSDate。然后我打电话给[self.view endEditing:YES];并接受另一个当前的NSDate。我花了起始日期和结束日期之间的时间间隔,并以秒为单位得到差异:0.000029

在第二次测试中,我分配了一个UITextField,将其设置为第一个响应者。然后,我执行了相同的NSDate计算,但使用if语句检查并查看UITextField当前是否为firstResponder,然后调用-resignFirstResponder,如果它确实是第一个响应者。时间差(以秒为单位)为:0.000012

这两项测试都是在iPhone 5s上运行的。

所以,我们在这里测量的是主线程被阻止了多长时间(这会导致应用程序的延迟感觉)。尽管如此,看到使用带有测试的-resignFirstResponder来查看textField是否是第一响应者的速度比仅在主视图上调用-endEditing:YES快.000017,真是太神奇了。这表明,这两种放弃第一响应者状态的方法之间的性能差异实际上可以忽略不计。

我不知道Apple在幕后做了什么?

答案 1 :(得分:0)

您是否考虑过存储成为第一响应者的内容?然后你只是辞职了?在那之后你不需要有条件。