2012-02-14 76 views
1

我從來沒有使用NSCoding之前,我很困惑它應該如何實現。存檔與NSCoding UIImageView

我目前的iPad應用程序有一個UIImageView(稱爲「背景」),這是我的主視圖控制器的屬性。 「背景」具有UIImage「圖像」屬性(顯然)以及由用戶添加的各種子視圖。添加的子視圖是我自己的UIImageView的自定義子類。

我需要能夠保存「背景」UIImageView的狀態,以便可以使用與存檔時相同的圖像和所有子視圖進行恢復。

我知道UIImageView符合NSCoding協議,但我不確定在哪裏實現encodeWithCoder和initWithCoder。我從我的主視圖控制器調用這些嗎?我需要爲UIImageView創建一個類別,它允許我重寫這些方法嗎?

我是否需要編寫代碼來存檔我的「背景」UIImageView及其子視圖的每個屬性?我已經讀過其他地方,因爲UIImage不符合NSCoding,因此需要進行子類化或添加一個類別以便能夠歸檔UIImageView。

我認爲會有一個簡單的方法來保存一個對象,包括它的所有屬性,子視圖等。看起來有很多事情需要做,以便我保存這個「背景」UIImageView並將其恢復後來。我努力想象我需要做的一切。任何指針非常感謝!

回答

3

序列化(也稱爲歸檔和非歸檔)實際上非常複雜,但Cocoa使其變得容易的程度是一個非常令人印象深刻的壯舉。

一旦你設置的東西,從而使的UIImageView和所有要保持其性能符合NSCoding,那麼所有你需要做的拯救的對象是:

NSData *dataToSave = [NSKeyedArchiver archivedDataWithRootObject:yourImageView]; 

然後將NSData存儲在某處。然後,爲了解開對象,在從某處恢復NSData之後,

UIImageView *restoredImageView = [NSKeyedUnarchiver unarchiveObjectWithData:dataToRestore]; 

至於把一切都符合NSCoding,UIImageView符合NSCoding,爲您UIImageView,其子視圖之間確實UIView,所以,他們的性質,一切都可能符合NSCoding除了實際UIImage。爲此,如果你的谷歌你可以找到許多類別,人們已經使其符合NSCoding,所以只需在你的項目中包括其中一個,你應該沒問題。