2012-10-27 63 views
8

我使用的Xcode 4.5和iOS 6.iOS 6的故事板:模態的視圖不駁回

我建立正在使用一個故事板普遍應用。我有一個視圖控制器,在導航欄中有一個按鈕。點擊按鈕時,我正在使用一個segue將另一個視圖控制器顯示爲模式。模態視圖控制器在其導航欄中有一個取消和保存按鈕。在故事板中,模式按鈕項鍊接到新動作退出動作,該動作應該展開到父視圖控制器,解除模態並調用動作處理程序。

這在iPhone上正常工作,但我看到iPad上的問題。在iPad上,當模式全屏顯示時,一切正常。當我將模式更改爲Page Sheet或Form Sheet(這是我所需的行爲)時,操作處理程序會被調用,但模式視圖控制器不會被自動解除。

是否有其他人看到過這種行爲?有沒有解決它的方法?

謝謝。

回答

6

感謝您詢問這件事,因爲我剛剛遇到同樣的問題。我認爲這是一個錯誤,但我還沒有提交給蘋果。與此同時,簡單的解決方法是在您的unwind:實現中(即,在通過Exit圖標連接到unwind segue的操作方法中)調用dismissViewController:animated:,從而自行減輕模態視圖。

我唯一擔心的是這個解決方案是,如果這個一個錯誤,並且Apple最終修復了它,他們的修復程序是否會使用此解決方法破壞任何代碼?只有時間會告訴...

後來編輯:我發現了一個更好的解決方法。子類化您想展開的類的父類(容器)類,然後實現展開。舉例來說,在我的應用程序,情況是這樣的:從ThirdViewController回到DetailViewController

UISplitViewController 
    UINavigationController 
     MasterViewController 
    UINavigationController 
     DetailViewController ----> modal segue ----> ThirdViewController 

出口/開卷賽格瑞演示錯誤 - 在unwind:實現被稱爲,但表單視圖沒有被駁回。但是,如果我繼承UISplitViewController並實現unwind:那裏,它工作正常。 (unwind:的實現可以是空的;關鍵是表單視圖會自動解除)。顯然,這是一個與容器視圖控制器有關的問題,您可以通過讓容器處理它來解決它。

看到我的示例項目,上傳到https://github.com/mattneub/Programming-iOS-Book-Examples/tree/master/ch19p561containerViewControllerStoryboard3Bug

+0

這對我有用。應該被接受爲正確答案。 – MiuMiu

4

冷靜,如果模態視圖控制器被自動解除,但在蘋果的例子here,他們使用了模態轉變爲SEGUE但隨後顯式調用dismissViewControllerAnimated:完成:在放開(退出)動作來解除它。

2

我有同樣的問題,所以我所做的就是:

- (IBAction)closeSalesJournal:(UIStoryboardSegue *)segue 
{ 
    // Unwind Segue 
    NSLog(@"Closed Sales journal VC"); 

    // For iPad, need to dismiss the view controller manually 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { 
     [self dismissViewControllerAnimated:YES completion:nil]; 
    } 
} 

這樣的話,我肯定要離開的標準方式爲iPhone和強制解僱與iPad。

0

我有類似的問題。我的模態賽格不會放鬆。浪費了太多時間之後,我發現了這個問題。是我的錯。

我在目標控制器中編寫得很差- (BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender。它並沒有期待我剛剛寫下的新賽季,所以它返回NO。實質上,我的新segue被告知不要由其他代碼解壓。