标签栏单击后的活动指示器

时间:2013-08-14 07:37:51

标签: iphone ios uiactivityindicatorview

我有三个视图控制器(A,B,C),当用户点击Tab Bar项时会显示。当用户单击第三个Tab Bar项时,将显示C View Controller。问题是,当选择第三个选项卡栏时,它会触发一个执行大量计算并创建UI元素的函数,并且我希望在完成这些任务时显示活动指示器。

现在我的情况是耗时的功能会阻塞主线程,因此当用户单击第三个Tab Bar项时,UI会冻结,并且当耗时的功能完成其工作时会显示C View Controller。但是我希望在执行函数时使用微调器显示C View Controller的背景。所以我试着把耗时的功能转移到一个新的线程,但我无法让它工作。

- (void)viewDidLoad中的CViewController.m中,我有:

activityView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
activityView.frame = CGRectMake(0, 0, 35, 35);
activityView.center = self.view.center;
[self.view addSubview:activityView];
[activityView startAnimating];

[NSThread detachNewThreadSelector:@selector(thirdTabClicked) toTarget:self withObject:nil];

然后是函数- (void)thirdTabClicked

//Bunch of code here...

[activityView performSelectorOnMainThread:@selector(calculationDone) withObject:nil waitUntilDone:NO];

- (void)calculateDone看起来像这样:

-(void) calculationDone {
    [activityView stopAnimating];
    [activityView removeFromSuperview];
}

但它不起作用。也许它与我有一个UITabBarControllerDelegate的自定义类这一事实有关,所以thirdTabClicked实际上是从那里调用的。所以我的TabBarControllerDelegate.m看起来像这样:

-(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {

if ([viewController respondsToSelector:@selector(secondTabBarClicked)]) {        
    [(id)viewController secondTabBarClicked];
}

if ([viewController respondsToSelector:@selector(thirdTabClicked)]) {
    [(id)viewController thirdTabClicked];
}
}

2 个答案:

答案 0 :(得分:0)

你可以试试这个

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{
    //Fire api
dispatch_async(dispatch_get_main_queue(), ^{
    //   update UI
});
});

答案 1 :(得分:0)

我想知道你为什么要自定义UITabBarControllerDelegate并直接调用方法thirdTabClicked?该方法已在viewDidLoad中调用,因此我认为没有必要从TabbarController委托中调用它。