1

我在导航栏中有一个 UIBarButtonItem ,它使用 segue 切换到另一个屏幕。这个其他屏幕需要一些时间来初始化,我想在 UIBarButtonItem 上放置一个 UIActivityIndi​​cator 以显示点击已注册,并且 iPad 正忙于执行操作。

我的做法是在UIBarButtonItem被按下后添加一个UIActivityIndi​​cator,然后调用performSegueWithIdentifier:,在viewDidLoad第二个视图的方法中,将初始化放入dispatch_sync()调用中。你可以猜到它不起作用......为什么?

第一个屏幕上的 IBAction:

- (void)tappedEdit: (UIBarButtonItem *)editButton {
    // put activity indicator somewhere
    UIActivityIndicatorView *indicator;
    indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
    indicator.frame = CGRectMake (200, 5, 50, 50);
    [self addSubview: indicator];
    [indicator startAnimating];
    // follow segue
    [self performSegueWithIdentifier: SegueShowDesignMode sender: editButton];
    }

第二个屏幕上的初始化:

- (void)viewDidLoad {
    [super viewDidLoad];
    // put costly operations into another queue to free main queue for activity indicator
    dispatch_sync (dispatch_get_global_queue (0, 0), 
                   ^{ // do initialization here
                   });
}

这样做的效果是 UIBarButtonItem 在执行初始化时保持点击状态,然后 UIActivityIndi​​cator 很快可见,最后显示 segue 动画,显示第二个屏幕。

任何想法?非常感谢!

编辑:问题的一个补充可能是初始化做了一些 UIKit 的东西:当我尝试使用信号量时,初始化转储在一些 UITextView 方法中带有 BAD ACCESS。我猜这是因为它在一些“get_global_queue”上运行,而不是在“get_main_queue”上运行。

再次编辑:嗯,不。正如 Apple 文档中所宣布的,使用 'get_main_queue' 会导致死锁。所以问题归结为

“如何在运行微调器的同时创建后台 UIView(很多!)?”

4

2 回答 2

1

我认为一个问题是您在第二个屏幕中使用dispatch_sync了您的viewDidLoad方法。dispatch_sync将阻塞你的线程,直到阻塞// do initialization here完成。尝试将其更改为dispatch_async

如果我是您,我会考虑做的另一件事是让UIActivityIndicator显示为第二个屏幕的一部分,而不是第一个屏幕。这样,第二个屏幕也可以在您的视图完成昂贵的操作后将其关闭。当然,这假设视图可以在这些操作完成之前实际显示。

于 2012-11-01T05:09:07.650 回答
1

如果您使用的是故事板

按钮栏项.h

 #import "CheckWifi.h"

    interface LoadingViewController : UIViewController 

    -(IBAction)BarItemPressed:(id)sender;

按钮栏项.m:

-(IBAction)BarItemPressed:(id)sender {LoadingViewController *DIS = [self.storyboard instantiateViewControllerWithIdentifier:@"CheckWifi"];
DIS.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:DIS animated:YES];}

加载视图控制器.h:

 @interface LoadingViewController : UIViewController {

    IBOutlet UIActivityIndicatorView *spinner

    }

-(IBAction)StopAnimating;

@end

加载视图控制器.m:

-(void)ViewDidLoad {

spinner.hidden = NO;

}

-(IBAction)StopAnimating {

    spinner.hidden = YES;

    }

如果您使用的是 XIB 文件,那么我真的无法帮助您,抱歉。

于 2012-11-01T12:26:35.357 回答