予先從UITabBarController
(VC1)能夠以關閉視圖控制器的整個堆疊除了控制器調用解僱
我然後在它上面呈現UIViewController
(VC2),並設置其可變命名parentController
到self
:
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 simultaneously,Dismissing a Presented View Controller。我覺得,設置這些parentController
變量是一樣的使用presentingViewController