2015-11-10 169 views
2

的當前鏈所以我有視圖控制器的鏈(通常爲2 - 3)式中的第一個是根視圖控制器和下一個都帶有presentViewController:animated:當前新視圖控制器和無形解僱呈現視圖控制器

即是應用程序的一個前部職並且當用戶最終到達我想去需要顯示主UI的一部分,我要取消所有的初始啓用視圖控制器(除了根視圖控制器)顯示主界面視圖控制器,它是一個UITabBarController。 我想這樣做的原因是 - 我不再需要它們,我不想將這些視圖控制器保留在內存中。

現在的問題是 - 我想這個樣子,我只是提出的UITabBarController,我不希望用戶看到駁回先前viewcontrollers的。

,我試過的第一件事:

  1. 呼叫dismissViewControllerAnimated:completion:根視圖控制器與animated: NO
  2. 完成後做presentViewController:animated:completion:animated: YES顯示我的UITabBarController

悲哀地閃過根視圖控制器顯示呈現我的UITabBarController的動畫。

先進的解決方案,我想:

  1. 採取的主要窗口
  2. 的快照添加快照作爲根視圖控制器的視圖的子視圖
  3. 呼叫dismissViewControllerAnimated:completion:根視圖 控制器animated: NO
  4. 完成後不presentViewController:animated:completion:animated: YES展示我的UITabBarController
  5. presentViewController:完成從根視圖控制器的視圖

刪除快照視圖下面是確實的代碼。這是一個比較複雜的,因爲它也能處理,因爲根視圖控制器彈出根視圖控制器的子視圖控制器中的UINavigationController:

- (void)popNavToRootAndPresentViewController:(UIViewController *)viewController 
{ 
    UINavigationController *rootVC = (UINavigationController *)self.view.window.rootViewController; 

    // if we have a chain of presented view controllers over our nav vc, then we need to dismiss them 
    if (rootVC.presentedViewController) { 
     // we need a snapshot view because even if dismissing without animation, root view controller will flash for a fraction of a second. 
     __block UIView *snapShotView = [self.view.window snapshotViewAfterScreenUpdates:NO]; 

     [rootVC.view addSubview:snapShotView]; 

     // hide the currently presented view controller chain without animation. This won't be visible since we've added the snapshot on the rootVC 
     [rootVC dismissViewControllerAnimated:NO completion:^{ 

      // present the new view controller that we need 
      [rootVC presentViewController:viewController animated:YES completion:^{ 
       // pop to root in case there are more than one pushed to nav stack 
       [rootVC popToRootViewControllerAnimated:NO]; 
       // we don't need the snapshot view anymore 
       [snapShotView removeFromSuperview]; 
      }]; 

     }]; 
    } else { 
     [rootVC presentViewController:viewController animated:YES completion:^{ 
      // we presented our vc from the nav vc, so we can pop the nav vs itself to root - that won't be noticable 
      [rootVC popToRootViewControllerAnimated:NO]; 
     }]; 
    } 

} 

即使將當前視圖層次的快照,我仍然有一個閃光。使用此解決方案dismissViewControllerAnimated結果在視圖控制器的短暫閃爍中,該視圖控制器是鏈中的前一個(呈現自我的那個)。

有沒有一種方式,期望的結果,而不閃爍實現?我想這樣的事情可以通過自定義父視圖控制器和子視圖控制器來實現,因爲這樣就可以更好地控制視圖被替換的方式,但是我真的想保持簡單並使用presentViewController:

+0

首先,什麼是你的根視圖控制器?你說你的根視圖控制器是UINavigationController,這是完全錯誤的。導航控制器將只有其他視圖控制器作爲它們的根視圖,它們不是它們自己的根視圖。 –

+0

是的,UINavigationController是UIWindow的根視圖控制器。正如我在提供的代碼示例中所示:(UINavigationController *)self.view.window.rootViewController。它不是另一個導航控制器的根視圖控制器。我們討論的不同種類的「根視圖控制器」。 –

回答

0

你可以簡單地存在(動畫)上的所有其他控制器的頂部的標籤欄控制器,一旦動畫完成,您可以關閉所有的控制器回到根,並再次呈現標籤欄控制器,這個時候不動畫。

請務必保持到標籤欄控制器的引用,因此您不必重新分配一個新的版本。

+1

我不認爲這會奏效。如果我在當前呈現的視圖控制器的頂部呈現標籤欄控制器,那麼我不能忽略其餘部分而不關閉新呈現的標籤欄控制器。如果我在root vc上調用dismissViewController,它會關閉所有鏈,包括標籤欄控制器。 –

相關問題