2012-04-15 26 views
11

這可能是不可能的,但我試圖保存我的應用程序在場景轉換之間的狀態,但我無法弄清楚該做什麼。目前我喜歡這種方式,當你有一個應用程序運行並點擊主頁按鈕時,你可以回到那個應用程序的位置,但如果你在場景之間切換(在故事板中),一旦你回到那個場景應用程序狀態未保存。保存iOS應用程序場景狀態

我只有兩個不同的場景需要保存(你從一個到另一個來回轉換)。如何在不佔用精確內存的情況下保存故事板場景狀態?

更多詳細信息:這是我的整個故事板。您可以使用加號工具欄按鈕在場景之間來回切換。在第二個場景中的用戶可以點擊表視圖細胞與真實的圖像會填充圖像視圖(參見圖1.2)

Figure 1.1圖1.1

在圖1.2,你看,當你點擊裏面一個發生了什麼許多表視圖細胞(圖像視圖彈出。)

Figure 1.2圖1.2

該問題:當你點擊表格視圖細胞,填補的圖像視圖(在圖1.2示出)它如果你停留在那個場景或者甚至是沒有問題的話,它會很好的工作點擊iPhone主頁按鈕(如果你點擊iPhone主頁按鈕,然後重新打開應用程序,場景的狀態被保存,圖像視圖充滿了簡單的圖像仍然顯示,就像我們離開它一樣),但如果我轉換(使用加號按鈕)回到第一個場景,然後使用第一個場景上的加號按鈕回到第二個場景,我創建的圖像視圖(如圖1.2所示)消失,第二個場景加載而不保存狀態和圖像視圖,我們填充。

編輯:我試圖使用相同的視圖控制器的兩個場景,但它沒有解決問題。

更新:我剛剛發現下面的代碼(我認爲存儲視圖狀態)。我怎麼能用這個,這是我一直在尋找的?

MyViewController *myViewController=[MyViewController alloc] initWithNibName:@"myView" bundle:nil]; 
[[self navigationController] pushViewController:myViewController animated:YES]; 
[myViewController release]; 
+2

操作系統應該爲你保存'場景'。你的情況有什麼特別的不同? – CodaFi 2012-04-15 23:24:27

+0

當我點擊home按鈕並重新打開應用程序時,它會保存場景的狀態,但當我轉換到其他場景並返回時,它不會保存場景。 – 2012-04-15 23:27:29

回答

2

我建議兩兩件事的組合: 1.取DBD的建議,並確保你沒有不斷地創造新的觀點 2.創建一個共享類是數據控制器(用於高爾夫球手,以使數據與場景無關)

使segues正確的方法是從左側的視圖控制器到右側的視圖控制器。然而,駁回右邊的一個,你可以使用

-(IBAction)buttonPushed:(id)sender 
     [self dismissModalViewControllerAnimated:YES]; 
} 

這將帶你回到了視圖控制器的左側,與左側的原始狀態視圖控制器。現在的問題是如何保存右側的數據。

要做到這一點,你可以創建一個單例類。 Singleton類只有一個實例,因此無論您轉到右側的視圖控制器多少次,數據總是相同的。

辛格爾頓類實現(一類叫DataManager的) - 頁眉

@interface DataManager : NSObject { 
} 

+(id)initializeData; 
-(id)init; 
@end 

辛格爾頓類實現(一類叫DataManager的) - 主要

static DataManager *sharedDataManager = nil; 

@implementation DataManager 
+(id)initializeData { 
    @synchronized(self) { 
     if (sharedDataManager == nil) 
      sharedDataManager = [[self alloc] init]; 
    } 
    return sharedDataManager; 
} 

-(id)init { 
    if(self == [super init]) { 
    } 
    return self; 
} 
@end 

然後,您的視圖控制器代碼裏面你可以像這樣抓住這個例子

DataManager *sharedDataManager = [DataManager initializeDataManager]; 

這樣你就會有無論您切換視圖的次數如何都是相同的數據。 此外,通過保持數據和視圖控制器分離,您可以更好地堅持MVC編程。 (http://en.wikipedia.org/wiki/Model–view–controller

0

我明白你的意思了。這應該發生在每個應用程序上,因爲當導航堆棧中的最後一個視圖控制器被轉換離開時,它將被釋放並釋放。如果您需要保存諸如文字或對象位置等值,則可能需要使用plist。有關如何使用plist,請參見this related question

+0

有什麼辦法我不能釋放/釋放場景 – 2012-04-16 01:02:58

+0

我從來沒有聽說過UIViewController單身......我想這是可能的。 – CodaFi 2012-04-16 02:30:02

0

蘋果不會爲你做這件事。您應該使用NSUserDefaults保存每個視圖的狀態,並且每次您的應用程序啓動後重新加載保存的數據。

如果你正在CoreData中存儲所有東西,你只需要保存活動視圖和一些對象標識符,如果沒有,你需要保存你所有的數據。

不要期望iOS在啓動時保存內存中的任何內容。只需將它存儲在NSUserDefaults中並每次加載它。

+0

我將如何存儲場景的狀態?我會存儲什麼對象?你能告訴我示例代碼嗎? - 我是iOS和客觀的新手... – 2012-04-24 11:04:22

0

將場景的狀態存儲在NSUserDefaults中或放置在plist文件中,然後在加載場景時只需使用該場景中的設置加載它。如果圖像是從互聯網上加載的,你可能也想將它們保存在你的iphones硬盤上,這樣它會更流暢一些。

+0

我將如何存儲場景的狀態?我會存儲什麼對象?你能告訴我示例代碼嗎? – 2012-04-24 11:02:41

2

圖1.1有一個根本的缺陷,我相信你的問題的基礎。

Segges(故事板上的控制器之間的箭頭)創建新的版本的UIViewControllers。你有循環賽段。所以當你通過segue回到原來的屏幕時,通過創建一個新版本真的讓你前進。

這可能會造成內存使用的一個主要問題,但這也意味着您無法維護狀態,因爲每個新創建的項目都是空白的。

由於您使用UINavigationControllerpushViewController:animated:您應該「彈出」您的控制器以擺脫它。

在您的「第二個」場景中,從+按鈕中刪除segue並在touchUpInside事件上創建IBAction。在IBAction代碼添加「彈出」

- (IBAction)plusButtonTapped { 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
+0

其實我沒有使用UINavigation Controller,我該如何在我的場景中實現它? – 2012-04-24 21:05:02

+0

在您的代碼中,您提到使用'[[self navigationController] pushViewController:myViewController animated:YES];'顯示您的第二個screne,這意味着您正在使用'UINavigationController' – DBD 2012-04-25 02:26:28

0

我不認爲你應該循環塞格斯,只需使用一個連接從視圖 - 控制2的ViewController 1應該是夠了,這樣你確保沒有額外viewcontrollers (內存問題可能?)

但是,對於你的特定問題,我相信你應該使用核心數據來保存你的表的確切狀態,查看,因爲ios並沒有保存完全的視圖狀態倍。這將需要工作,但你會達到你想要的。您需要保存確切的照片(使用將保存的代碼或枚舉),表格視圖中的位置,分數或任何您需要保存該數據的數據。

最棒的是,coredata非常高效,可以在應用程序重新映射或重新加載數據時重新加載數據,而無需花費時間,並且使用核心數據加載超過5k條記錄,直到現在,並且工作得很好,它一點都不慢。

當我回到家裏生病提供一個代碼,你可能會用它來了解我的意思。

0

這裏的關鍵是:

  1. 有某種存儲的數據,你的應用需求。這是你的應用程序的數據模型。

  2. 爲每個視圖控制器提供對模型的訪問權限,或者至少對模型中需要執行其工作的部分進行訪問。然後,視圖控制器可以使用模型中的數據在創建時或者即將顯示視圖時對其進行配置。

  3. 讓每個視圖控制器在適當的時候更新模型,比如當視圖即將消失時,甚至每次用戶進行更改時。

有很多,你可以在內存中組織數據的方式,並且有很多的方式,你可以將其存儲在磁盤上(即,在長期儲存)。屬性列表,核心數據,普通舊數據文件和鍵控歸檔都是將數據寫入文件的可能性。 NSArray,NSDictionary,NSSet等都是您可以用來幫助您在內存中組織數據的類。儘管如此,沒有任何關係讓你的視圖控制器保持持久性。你肯定會使用它們,但是你選擇哪一個並不重要,只要更新視圖控制器就行了。重要的是,你有一些模型,並且你的視圖控制器可以訪問它。

通常,應用程序委託會設置模型,然後根據需要將它傳遞給視圖控制器。

可能有幫助的東西是,你不需要讓您的視圖控制器在彈出導航堆棧時被刪除。如果需要,您可以在應用程序委託中設置兩個視圖控制器,以便它們繼續存在。然後你可以使用你得到的那些,而不是一直創建新的,這樣你會自動獲得一定程度的持久性。