2014-03-27 64 views
0

我有一個視圖控制器,它繼承了第二個視圖控制器,該視圖控制器加載了多個圖像,但在從第一個VC到第二個圖像之前,它會掛起一兩秒鐘。我試圖添加一個UIActivityIndi​​catorView,以便用戶不認爲該應用程序被凍結(這是目前的感覺)。然而,我似乎無法讓它正常工作,並且我看到的所有示例都使用Web視圖或正從服務器訪問某種數據,而我正在加載存儲在應用程序中的圖像。在切換視圖控制器時顯示UIActivityIndi​​catorView

我下面有一些代碼來顯示我所嘗試的。

.h文件中

@interface SecondViewController: UIViewController 
@property (strong, nonatomic) UIActivityIndicatorView *indicator; 

.m文件

-(void)viewWillAppear:(BOOL)animated 
{ 
    self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 

    self.indicator.center = CGPointMake(160, 240); 

    [self.view addSubview:self.indicator]; 

    //Loading a lot of images in a for loop. 
    //The images are attached to buttons which the user can press to bring up 
    //an exploded view in a different controller with additional information 
    [self.indicator startAnimating]; 
    for{....} 
    [self.indicator stopAnimating]; 
} 

我曾嘗試使用也將dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)呼籲[self.indicator startAnimating],但所發生的一切是視圖控制器即刻加載和圖片後,立即/按鈕從不加載。

當用戶單擊第一個視圖控制器上的「下一個」按鈕時,如何擺脫延遲?應用程序掛在第一個VC大約一兩秒鐘,然後最後加載第二個視圖控制器與所有的圖像/按鈕。我是否需要將UIActivityIndicatorView添加到第一個視圖控制器,或者我是否完全錯誤地進行了這種操作?我願意接受任何和所有的方法來完成這件事,事先要感謝。

回答

1

您需要在下一個運行循環中調用初始化代碼和stopAnimating。一個簡單的事情你可以做的是:

-(void)viewWillAppear:(BOOL)animated 
{ 
    self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 
    self.indicator.center = CGPointMake(160, 240); 

    [self.view addSubview:self.indicator]; 

    //Loading a lot of images in a for loop. 
    //The images are attached to buttons which the user can press to bring up 
    //an exploded view in a different controller with additional information 
    [self.indicator startAnimating]; 
    [self performSelector:@selector(loadUI) withObject:nil afterDelay:0.01]; 
} 

-(void) loadUI { 
    for{....} 
    [self.indicator stopAnimating]; 
} 

當然也有其他的方式來在未來的運行循環運行loadUI(如使用定時器)。

+1

這種方式將掛起主線程,而用戶界面將是不負責任的。您應該在後臺線程中加載UI並派發到主線程來更新UI。 – sahara108

+0

用戶界面將被阻止,直到「for {...}」部分完成,但活動指示器將正確地進行動畫。實現實際上取決於設計:您是否希望用戶能夠在「for {...}」初始化完成之前與UI進行交互。如果在後臺線程中調用loadUI並分派給主線程,則用戶將能夠在「for {...}」完成之前與UI進行交互,這可能不是作者想要的。 – subchap

+0

在圖像/按鈕加載之前,用戶不需要與應用程序進行任何交互。我希望應用程序顯示指示器,直到圖像全部加載。 – DevilsDime

相關問題