0

調用pushViewController這裏是我的代碼...無法獲得UIActivityIndi​​cator露面,而在didSelectRowAtIndexPath方法

- (void) threadStartAnimating { 
    [activityIndicator startAnimating]; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    activityIndicator=[[UIActivityIndicatorView alloc] init]; 
    [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    activityIndicator.center=[self tableView].center; 
    [[self tableView] addSubview:activityIndicator]; 

    [NSThread detachNewThreadSelector:@selector(threadStartAnimating) toTarget:self withObject:nil]; 
    EventController *eventController = [[EventController alloc] init]; 
    [eventController setEventID:[[lineItems objectAtIndex:[indexPath row]] objectForKey:@"view_event_button_param"]]; 
    [activityIndicator stopAnimating]; 
    [[self navigationController] pushViewController:eventController animated:YES]; 
} 

事件控制器包含一個Web服務,需要幾秒鐘的加載。我能得到活動指示器顯示的唯一方法是如果我在那裏拋出一個無限循環...我發現了一堆提到將它放在一個單獨的線程中的例子,但它似乎不起作用。

+0

那麼'EventController'從它的'init'方法從web服務加載東西呢?或者其他地方 – mattjgalloway 2012-01-10 22:21:16

+0

是的,eventControllers viewDidLoad方法調用我的方法loadDataIntoView它調用Web服務 – 2012-01-10 22:36:35

+0

然後看到我的答案。 – mattjgalloway 2012-01-10 22:41:48

回答

5

你的問題是,如果你正在獲取viewDidLoad中的數據,那麼直到加載視圖之後纔會調用該方法,這通常是在首次顯示該視圖控制器的過程中。在你的情況下,這是在撥打pushViewController:animated:期間。

所以一個辦法,你想可能是交換圍繞這兩條線是什麼:

[activityIndicator stopAnimating]; 
[[self navigationController] pushViewController:eventController animated:YES]; 

但是,在所有誠實,我會創建一個協議稱爲EventControllerDelegate,有一個弱引用屬性的id <EventControllerDelegate>在你的EventController,然後設置視圖控制器,它創建EventController作爲代表,然後再按下它。然後在委託中定義一個方法並在視圖控制器中實現它,並在該方法中停止微調器。然後在EventController中,當您完成加載數據時,請調用委託方法。

編輯:如果你真的想這樣做沒有定義一個委託,你可以嘗試改變你的代碼是這樣的:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    activityIndicator=[[UIActivityIndicatorView alloc] init]; 
    [activityIndicator setActivityIndicatorViewStyle:UIActivityIndicatorViewStyleWhiteLarge]; 
    activityIndicator.center=[self tableView].center; 
    [[self tableView] addSubview:activityIndicator]; 

    EventController *eventController = [[EventController alloc] init]; 
    [eventController setEventID:[[lineItems objectAtIndex:[indexPath row]] objectForKey:@"view_event_button_param"]]; 

    [activityIndicator startAnimating]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     UIView *v = eventController.view; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      [activityIndicator stopAnimating]; 
      [[self navigationController] pushViewController:eventController animated:YES]; 
     }); 
    }); 
} 

它使用GCD清楚和一貫的「視圖屬性訪問迫使一個loadView/viewDidLoad「黑客。

+0

切換這些行不起作用。該指標不會顯示。也許是因爲沒有足夠的時間?我希望得到最簡單的解決方案。很多我的屏幕需要加載的各種原因,我希望只是粘貼一些代碼在每個區域,我初始化下一個viewController – 2012-01-11 00:03:11

+0

嗯,你不能,真的。我真的提出了像我展示的委託方式。 – mattjgalloway 2012-01-11 00:07:09

+0

是否有其他地方我可以移動Web服務代碼,這將允許它以我擁有它的方式工作?也許viewWillAppear? – 2012-01-11 00:27:26

-3

您需要爲您的activityIndicator設置一個幀大小。

activityIndicator.frame = CGRectMake(x, y, 40, 40); 
+0

不起作用。我不認爲這是必要的,因爲它會顯示如果我投入無限循環 – 2012-01-11 00:04:17