2017-07-25 58 views
1

予先從UITabBarController(VC1)能夠以關閉視圖控制器的整個堆疊除了控制器調用解僱

我然後在它上面呈現UIViewController(VC2),並設置其可變命名parentControllerself

let loginController = LoginController() 
DispatchQueue.main.async { 
    self.present(loginController, animated: false, completion: { 
     // Once presented, set parentController = self 
     loginController.parentController = self 
    }) 
} 

然後我繼續在VC2的頂部呈現的第三UIViewController(VC3)當用戶輕敲一個「登錄用電子郵件鍵」:

let withEmailController = WithEmailLoginController() 
withEmailController.parentController = self 
present(withEmailController, animated: true, completion: nil) 

與電子郵件註冊後,我提出第四UIViewController(VC4),因此用戶可以挑選自己的個人資料圖片

let profilePicturePickerController = ProfilePicturePickerController() 
profilePicturePickerController.parentController = self 
present(profilePicturePickerController, animated: true, completion: nil) 

用戶已經拿起自己的個人資料圖片後,我在想駁回VC2調用此代碼VC4 ,VC3,並且從功能VC2 VC4:

parentController?.parentController?.handleDismiss() 

handleDismiss在VC2很簡單:

func handleDismiss() { 
    // Progress MainTabBarController 
    parentController?.progressWithLoggedInUser() 
    // Dismiss the LoginController 
    self.dismiss(animated: true) { 
     // I do some things in here that aren't relevant to the question 
    } 
} 

問題: 當從VC2調用名爲handleDismiss的屬於VC2的功能時,一切正常,並且VC2被解除(VC3和VC4因爲尚未出現而未被解除)。但是,如果從VC4調用handleDismiss,則只有VC3和VC4被解除。 VC2依然存在。根據我的理解,VC1,2,3,4都在同一個堆棧中。

我試過的東西: 把所有的禮物/解僱命令放在DispatchQueue.main.async {code}。 直接在VC4中調用parentController?.parentController?.dismiss(animated: true, completion: nil)具有相同的錯誤。從調用VC2 handleDismiss(),以確保它正常工作

還有什麼地方我都看了: Dismiss more than one view controller simultaneouslyDismissing a Presented View Controller。我覺得,設置這些parentController變量是一樣的使用presentingViewController

回答

0

好的結果是重新閱讀蘋果文檔是一個好主意

答案:我現在的理解是,在UIViewController調用dismiss根據控制器是否有任何孩子(控制器顯示在其上)做兩件不同的事情。如果您在最頂層的視圖控制器上調用dismiss,即topController.dismiss(animated: true){code},它將按預期解除該頂層控制器。但是,如果您在有孩子的控制器上致電dismiss,它將會解除該控制器的所有孩子,但不是該控制器本身。最頂級的孩子是唯一一個動畫。

如果調用堆棧中的解僱,你必須把它放在孩子的父母,你要解僱:parentController.dismiss(animated: true){code}

實施的解決方案:功能handleDismiss()已移入VC1和修復一切。