【问题标题】:Popover from UIButton very slow on deviceUIButton 的弹出窗口在设备上非常慢
【发布时间】:2012-07-31 03:02:30
【问题描述】:

场景:

UIScrollView 有一个 UIButton。点击 UIButton 会导致 UIPopoverController 从指定的矩形呈现自己。 UIPopoverController 的 contentViewController 是一个带有 UIDatePicker 的 UIViewController。

点击按钮时触发的代码(按钮是自定义类型,在点击内注册了触摸):

- (void)showCalendar:(id)sender {
    dateViewController = [[UIViewController alloc] init];

    datePicker = [[UIDatePicker alloc] initWithFrame:CGRectMake(0, 0, 240, 200)];
    datePicker.datePickerMode = UIDatePickerModeDate;
    datePicker.hidden = NO;
    datePicker.date = [NSDate date];

    [datePicker addTarget:self
                   action:@selector(DateChanged:)
         forControlEvents:UIControlEventValueChanged];

    NSLocale *US = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
    NSCalendar *cal = [NSCalendar currentCalendar];
    [cal setLocale:US];
    [datePicker setCalendar:cal];
    [datePicker setMaximumDate:[NSDate date]];


    dateViewController.view = datePicker;

    dateViewController.contentSizeForViewInPopover = CGSizeMake(240, 200);
    self.popoverController = [[UIPopoverController alloc] 
                               initWithContentViewController:dateViewController];
    self.popoverController.delegate = self;

    NSLog(@"YESYESYES");

        [self.popoverController presentPopoverFromRect:CGRectMake(753, 513, 1, 1) inView:parentView permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];

    NSLog(@"NONONO");

}

当我将设备连接到 Xcode 并运行应用程序时,两个 NSLog 语句之间存在明显的 1 秒或更长时间的延迟。出现这种滞后的原因可能是什么?

【问题讨论】:

  • 它可以在后台线程而不是主线程中吗?如果你有一个 IBAction 调用这个方法,把这个方法放在 GCD 主队列中。
  • 不。它在主线程上运行。
  • 当按钮被按下时,这是调用的方法吗?或者这个方法是从另一个方法调用的? (即 IBAction 或其他)
  • 另外,请在下面查看我的答案。开个玩笑,你能试着把NSLog 语句和presentPopover 代码放到GCD 中,就像我在例子中展示的那样吗?这样做之后的延迟是多少?
  • 奇怪的问题,奇怪的解决方案。您使用的是 iOS 6 测试版吗?我有同样的问题,但从情节提要加载控制器。我的弹出框还包含一个日期选择器,但您的解决方案不适用于我的情况。如果您对根本原因有任何想法,请告诉我。

标签: iphone ios ipad uibutton uipopovercontroller


【解决方案1】:

通过替换解决问题

dateViewController.view = datePicker;

[dateViewController.view addSubview:datePicker];

【讨论】:

    【解决方案2】:

    你在哪个队列中运行这个方法?

    要在主队列中运行它,试试这个。如果您没有使用 Interface Builder,请将 IB 代码替换为适当的代码。

    - (void)showCalendar:(id)sender {
    
        // your setup code here... then:
    
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"YESYESYES");
            [self.popoverController presentPopoverFromRect:CGRectMake(753, 513, 1, 1) inView:parentView permittedArrowDirections:UIPopoverArrowDirectionDown animated:YES];
            NSLog(@"NONONO");
        });
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 1970-01-01
      • 2021-06-05
      • 1970-01-01
      • 2021-04-09
      • 2021-07-28
      • 1970-01-01
      相关资源
      最近更新 更多