UIImagePickerController *picker = [[UIImagePickerController alloc] init];
[self presentViewController:picker animated:YES completion:nil];
換成
UIImagePickerController *picker = [[UIImagePickerController alloc] init];
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[delegate.window.rootViewController presentViewController:picker animated:YES completion:^{
}]; 理論上是允許從一個控制器present到另外一個控制器,再從這個控制器present另外一個控制器.
我在網上查了有個大神這樣解釋的:
一般來說我們呈現一個viewcontroller 裡面的內容,經常採用的方式是用navigationcontroller與tabbarcontroller來管理檢視控制器。在這種情況下,呈現的視圖控制器都在一個app維護的控制器堆棧裡面。
而有一種情況就是通過self.view addsubview:AviewController.view也可以呈現出某個視圖控制器。這種情況雖然看上去跟 push的結果沒什麼不同,但是實際上這個被呈現的view的controller並沒有在當前app的視圖堆棧裡,也就是所謂的
detachviewcontroller,如果你在這個分離之外的視圖控制器裡面做present 調用,就會出現上述問題。
所以判定是否為分離視圖,就是看它是不是處在當前app的控制器堆棧裡面。
顯然app的 rootviewcontroller 當然是處於堆棧裡,並且是堆棧最底層的視圖控制器。所以這種解決方案在一定程度上是可行的。