2009-10-24 30 views
4

我有一個很大的屏幕應用程序,所有的排列在一個層次結構中,頂部有一個UITabBarController,下面是UINavigationControllers,然後是下面的UIView控制器,也許有一個模式控制器在某個地方引發了很好的測量。如何讓我的iPhone應用程序以特定屏幕顯示?

允許用戶從列表中選擇一個開始屏幕。一旦選擇,下次啓動應用程序將從指定的屏幕開始,所有的導航將工作,就像他們自己在那裏導航一樣。

由於我無法繼承UITabBarController和UINavigationController,因此我無法添加任何ivars來設置任何初始導航信息。

那麼,在這些條件下顯示正確的視圖控制器的屏幕,並且快速執行操作的最佳方式是什麼?

回答

1

您將希望檢出NSCoder並在退出前保存視圖層次結構。這樣,要加載它們,只需反序列化視圖層次結構,並且狀態應該相同。

+0

一個有趣的建議,但我認爲會有問題。我不需要或希望我的整個層次結構保存和恢復,只需要控制器的狀態。如果我這樣做,它會保存的意見呢? – 2009-10-25 00:43:42

+0

通過實施NSCoder,您負責編寫您需要的內容,並重新初始化您需要的內容。這是一種節省應用程序狀態的快速方法,而不是視圖本身。它爲您提供了一種安全可靠地重新加載視圖控制器等的方法......無需對NSUserDefaults進行100次調用。 – coneybeare 2009-10-25 04:49:53

+0

coney的一個問題 - 我按照我在答案中列出的方式進行操作的部分原因是因爲我可以在用戶前進時保存應用程序的狀態(爲導航控制器設置委託,實現navigationController:willShowViewController:動畫或didShow)。用你的方法,在applicationWillTerminate中是否有任何危險不會被調用或不會完成? – bpapa 2009-10-25 14:04:47

0

保存用戶每次想要加載的標籤的索引,然後當應用程序開始將UITabBarController.selectedIndex屬性設置爲該索引時,則需要在UITabBarController.selectedViewController上調用viewDidAppear。這應該會觸發索引設置爲可見。

+0

這是最簡單的部分。所有其他視圖控制器如何? – 2009-10-25 00:39:35

0

我通過將一些不同的值保存爲用戶默認值來完成此操作。但是,我的applicationDidFinishLaunching方法有點麻煩,因爲我使用一堆條件語句將視圖控制器推入堆棧,決定選擇哪個選項卡,決定是否顯示模式視圖等。

+0

這就是我最終不想結束的地方:在一個地方放着一個大球。但如果沒有別的方法,我會在這裏結束...... – 2009-10-25 04:06:42

0

我是不知道你描述的是什麼問題。也就是說,爲什麼不

  • 保存無論是當前顯示的視圖(如果只有到那裏單程)或用戶的導航路徑(如果有多個路由)上的應用程序退出,然後

  • 重新創建視圖的層次結構,如果用戶已經在你的appDidFinishLaunching

導航...?

例如,您可以保存控制器的類名稱,因爲它們被推入堆棧,然後當應用程序重新加載時,創建單獨的控制器類並將它們推送到導航堆棧上。對於選項卡控制器,您需要保存當時選擇哪個選項卡的索引。

如果您的問題比這個更復雜,可以編輯它來解釋您卡住的具體部分。

+0

我知道幾種方法來實現我的目標,但我要求最好。特別是,建議的方法都需要知道整個應用程序導航的集中式代碼片段。如果導航欄更改而未更新,它將會中斷。我真正想要的是一種分佈式OO方式。 – 2009-10-25 18:30:10

0

以下是我做到的。 兩種方法都在appDelegate中,tabBarController是一個實例變量。

- (void)applicationDidEnterBackground:(UIApplication *)application 
{ 
    /* 
    Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 
    */ 

    //Remember the users last tab selection 
    NSInteger tabIndex = self.tabBarController.selectedIndex; 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    [userDefaults setInteger: tabIndex forKey:@"activeTab"]; 

    if (![userDefaults synchronize]) 
    { 
     NSLog(@"Error Synchronizing NSUserDefaults"); 
    } 

} 

- (void)applicationDidBecomeActive:(UIApplication *)application 
{ 
    /* 
    Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 
    */ 

    //Set the tabBarController to the last visted tab 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
    int activeTab = [(NSNumber*)[userDefaults objectForKey:@"activeTab"] intValue]; 
    self.tabBarController.selectedIndex = activeTab; 
} 
相關問題