簡體   English   中英

iOS 8中的UISplitViewController狀態恢復

[英]UISplitViewController state restoration in iOS 8

在iOS 8上,UISplitViewController似乎可以保存和恢復其子視圖的狀態,例如,是否隱藏主視圖。

這是不可取的,因為我的應用程序應始終在橫向顯示主視圖並始終以縱向隱藏它。 如果用戶以橫向關閉應用程序(保存橫向狀態)並以縱向重新打開(橫向狀態已恢復),則UISplitViewController將以錯誤的配置顯示主視圖。

我仍然需要為UISplitViewController提供恢復標識符,以便子視圖控制器保存和恢復自己的狀態。 那么如何防止UISplitViewController恢復自己的狀態,或者覆蓋這種行為呢?

我通過繼承UISplitViewController並重寫- (void)decodeRestorableStateWithCoder:(NSCoder *)coder來解決這個問題。 這樣,拆分視圖控制器沒有機會恢復其視圖,但其子視圖控制器仍然參與狀態恢復。

實現UI狀態恢復時所需的第一件事就是從使用didFinishLaunchingWithOptions變為willFinishLaunchingWithOptions。 如果您現在在willFinish中設置委托,則將按預期調用折疊。 問題很可能是代表設置得太晚了,如果沒有你的特殊處理,它已經崩潰了。

另一個問題是,當在橫向和縱向時,控制器的恢復路徑是不同的,因此可能處於奇怪的狀態。 由於更改,它無法自動查找現有詳細信息視圖控制器並創建新實例,並且由於詳細信息項的配置錯誤,拆分視圖委托可能會丟棄其中一個或其中一個實例。 在第3步“重新創建視圖控制器”下的狀態恢復文檔中,它表示它會查找已創建的具有相同路徑的視圖控制器,這種路徑在方向/特征更改后因路徑不同而進行恢復時可悲地失敗。 所以它回到第4步並創建一個全新的空配置錯誤的細節控制器,這就是你看到控制器配置錯誤的原因。

要了解恢復標識符路徑,請實現應用程序:viewControllerWithRestorationIdentifierPath:coder:在app委托中輸出您將在縱向中看到的要恢復的最后一個路徑組件,如下所示:

SplitViewController,
MasterNavigationController,
DetailNavigationController,
DetailViewController

...對應於拆分視圖控制器的單層次主要(注意:DetailNavigationController是此配置中隱藏的嵌套導航控制器)。

在景觀中,最后兩個要恢復的是:

SplitViewController,
MasterNavigationController,
MasterViewController

SplitViewController,
DetailNavigationController,
DetailViewController

...對應於拆分視圖的主要和次要控制器層次結構。

因此,現在知道DetailViewController的恢復路徑可能不同,您可以理解,如果您嘗試在故事板在橫向中初始化時自動恢復縱向路徑,則無法找到該詳細視圖控制器並求助於創建新的控制器。 因此,我認為無論恢復路徑如何保存,解決方案都是幫助找到它:

- (UIViewController *)application:(UIApplication *)application viewControllerWithRestorationIdentifierPath:(NSArray *)identifierComponents coder:(NSCoder *)coder{
    if([identifierComponents.lastObject isEqualToString:@"DetailViewController"]){
        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;
            UINavigationController *secondaryNavigationController = splitViewController.viewControllers.lastObject;;
            DetailViewController *detail = (DetailViewController *)secondaryNavigationController.viewControllers.firstObject;
        return detail;
    }
    return nil;
}

現在,恢復將正確使用正確配置的現有詳細控制器,並且拆分視圖委托不會拋棄它,導致您留下主控。

此問題可以表現的另一種方式是在恢復后看到兩個細節控制器被推入導航堆棧,如果您強制拆分視圖委托不丟棄初始細節控制器,並且當修復創建另一個時,您最終會發生這種情況兩個推!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM