2014-07-17 60 views
1

我在我的應用程序中需要通過unwind segue關閉模態視圖控制器,然後在呈現不同的模式視圖控制器後出現情況。要做到這一點,我只是拖延了電話,以1.0秒的時間呈現新的視圖控制器。這可能無法一直工作,也許如果由於某種原因需要花費較長時間才能解決問題,則第二個視圖控制器將無法顯示,因爲正在進行轉換。我遇到了這種情況,雖然在這種情況下它確實起作用。這已記錄:如何在當前演示文稿完成後執行segue

警告:試圖在演示文稿正在進行時呈現!

我正在尋找更好的解決方案。我想知道是否有可能拋出新的視圖控制器後,第一個完全解散,通過回調,但沒有performSegueWithIdentifier有一個完成塊。

如何解除模態視圖控制器然後提出一個新的視圖控制器,始終確保不會發生衝突?

這是我目前的解決方案:

[self performSegueWithIdentifier:@"Unwind Segue" sender:self]; //dismiss modal or pushed VC 

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ 
    [tabBarController performSegueWithIdentifier:@"Show New VC" sender:self]; //present new modal VC 
}); 
+0

爲什麼不從當前的控制器中提出新的模態控制器,而不是首先展開?放開然後立即呈現另一個的目的是什麼? – rdelmar

+0

我放開回到標籤欄可見的位置,然後執行segue,因爲該segue僅爲「tabBarController」定義。這是一個有很多屏幕的複雜應用程序,我不希望爲每個視圖控制器中的視圖控制器創建一個segue。此外,實際上希望回到這種情況下的「主頁面」。 – Joey

+1

我認爲你應該可以調用你正在展開的控制器的viewDidAppear方法中的performSegue。你可以在unwind方法中設置一個標誌,並檢查viewDidAppear是否知道你是否應該執行執行。 – rdelmar

回答

1

你也可以做的是什麼加上使用NSNotificationCenter新控制器的viewDidAppear功能的通知。然後,您將偵聽程序附加到通知中,當您看到通知顯示時,您將進行下一次轉換。

- (void)viewDidLoad { 
    [[NSNotificationCenter defaultCenter] postNotification:[NSNotification notificationWithName:@"transitioned to new controller!" object:nil]]; 
} 

其他地方,只需添加此來收聽通知。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedNotification:) name:@"transitioned to new controller!" object:nil]; 

不要忘了停下您收到您的通知後(除非你希望保持觀察)此通知傾聽,否則你將繼續在整個應用程序中觀察的所有通知:

[[NSNotificationCenter defaultCenter] removeObserver:self name:@"transitioned to new controller!" object:nil]; 
+0

謝謝你建議使用通知。我和Eric Amorde使用viewDidDisappear的建議一起使用了這一點,並且rdelmar建議使用bool知道是否在解僱後繼續。謝謝大家! – Joey

11

它花了我一段時間才弄明白這一個。 iOS 7引入了transitionCoordinator,它只在動畫期間出現在UIViewController上。簡而言之,您必須在主隊列中的另一個線程(在動畫啓動後運行)中註冊完成塊。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // ... prepare your for segue 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     [self.transitionCoordinator animateAlongsideTransition:nil completion:^(id<UIViewControllerTransitionCoordinatorContext> context) 
     { 
      // Segue animation complete 
     }]; 
    }); 
}