2014-10-09 50 views
5
UIPopoverController *popCtrl = [[UIPopoverController alloc] initWithContentViewController:self.rootViewController.navigationController]; 
popCtrl.delegate = self; 
[popCtrl presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; 

此代碼位於按鈕操作中,其中按鈕是「發件人」。異常「應用程序試圖呈現模態化的主動控制器」僅在iOS 8中崩潰

帶presentPopoverFromBarButtonItem的行會導致引發異常,原因如下:Application tried to present modally an active controller DetailViewController: 0x15a54c00。在這種情況下,DetailViewController是「self」,它只是popCtrl的委託,所以我不明白它是如何嘗試以模態方式呈現的。它應該呈現rootViewController.navigationController。

正如您可能已經從名稱中猜到的那樣,rootViewController和detailViewController在SplitViewController中,但在嘗試使用彈出窗口呈現rootViewController之前,它將從SplitViewController中移除。

這隻發生在使用iOS 8 SDK構建的iOS 8上。它也不是100%可重複的。大多數情況下,這種異常發生,但有時在重新啓動應用程序後,它根本不會發生,直到我重新運行該應用程序,然後它再次開始發生。 (我把它放在try/catch中,所以我知道它每次運行可能會發生一次以上)。

我幾乎肯定這是SDK中的另一個iOS 8錯誤,但有人提出了一種解決方法?

+0

此錯誤仍然存​​在於iOS8.1 – Steve 2014-10-20 20:35:21

+0

請參考以下鏈接我希望這將幫助你 http://stackoverflow.com/questions/25094028/application-tried-to-present-modally-an -active-controller-crashing-why – sandy 2014-10-21 08:55:53

+0

感謝您的提示,但我不認爲這可以幫助我,因爲我沒有使用故事板或繼續使用。 – Steve 2014-10-21 15:26:16

回答

0

我在IBAction中以編程方式在iOS 8中使用彈出窗口。我不知道這是否是一個錯誤,但我確實知道他們確實對模態視圖和演示文稿進行了一些更改。有一個很好的WWDC視頻,看看你是否能找到它。我這樣做(請記住,這是斯威夫特,所以你需要做翻譯的一點點)的方法如下:

let controller = self.settingsVC 
controller.preferredContentSize = CGSizeMake(345, 234) 
controller.modalPresentationStyle = UIModalPresentationStyle.Popover 
var settingsPopController = controller.popoverPresentationController 
settingsPopController?.delegate = self 
settingsPopController?.sourceView = self.view 
settingsPopController?.sourceRect = sender.frame 
controller.modalPresentationStyle = UIModalPresentationStyle.Popover 
self.presentViewController(controller, animated: true, completion: nil) 

在這段代碼,self.settingsVC是視圖控制器的屬性我設置了哪個被初始化爲故事板中的另一個ViewController,但是您可以用需要作爲彈出窗口呈現的ViewController替換控制器。另外,請注意你的UIViewController類必須實現UIPopoverPresentationControllerDelegate。 如果您需要任何翻譯幫助,我很樂意爲您提供幫助。

+0

感謝您的建議,但是使用UIPopoverPresentationController的新方式導致完全相同的異常。 – Steve 2015-01-08 23:07:01

1

我在更新某些應用程序時面臨同樣的問題,最初是在iOS 5.0時代開發的。在彈出窗口中使用它之前從UISplitViewController中刪除控制器不起作用,它也不能幫助切換到較新的UIPopoverPresentationController。

但是,我能夠從左側輕掃我的(主)控制器。或多或少,我發現,「功能」是偶然,所以我擡起頭,其中這是從哪裏來的,發現這個蘋果的iOS SDK 5.1版本說明:呈現在

在5.1 UISplitViewController類採用了滑動的演講風格左視圖(以前只在Mail中看到)。此演示文稿通過委託方法提供的現有欄按鈕項或右側視圖中的輕掃手勢啓動時使用。獲取此行爲不需要額外的API採用,並且所有現有API(包括代理提供的UIPopoverController實例的所有API)將繼續像以前一樣工作。如果您的應用不支持該手勢,請將您的分離視圖控制器的presentsWithGesture屬性設置爲NO以禁用該手勢。但是,禁用該手勢是因爲它的使用在所有應用程序中保留了一致的用戶體驗。

(來源:iOS 5.1 Release Notes,要求蘋果開發者登錄)

我沒有測試,如果你設置所提到的屬性NO會發生什麼,如果它釋放控制器,但我不會把太多希望這一點。

所以即使在從UISplitViewController手動刪除它之後,我的視圖控制器仍然在該隱藏的可滑動窗格上處於活動狀態,這似乎在SDK內部發生。我意識到這個事實,在iOS 7.x之前它仍然可以正常工作,但我實際上認爲它現在已經成爲可以容忍的錯誤,並在iOS 8.0中關閉了。

我最終完全放棄了彈出窗口,並使用iOS 5.1及更高版本的默認UISplitViewController行爲。對於一些額外的調整,您可以更改UISplitViewController.preferredDisplayMode以適合您的需求,這爲我節省了很多時間來升級從未聽說過自動佈局的舊代碼。

相關問題