iOS 不同界面(ViewController)之間傳值

今天遇到一個問題:如何在多個viewController 之間進行傳值,我有A、B、C三個 view,三個 view 均在同一 Navigation Controller 容器中,關係如下圖:



在 AB 或 BC 之間傳值較爲熟悉,可以選擇的方式有:delegate, block, 屬性設置 等。但A到C之間傳值之前沒有實現過,查資料後找到幾種選擇:1.userDefault 或文件的方式 2.notification的方式 3.單例模式 (KVO、KVC沒有仔細研究實現方式)

選擇單例模式的話感覺會增加數據模型的複雜性,暫時沒選擇;notification的方式昨天嘗試了一下,但app會crash而且沒有錯誤提示;最後嘗試通過userDefault 的方式成功實現。

在C類.m文件中popViewController 或其他地方添加以下代碼:

<span style="font-family:FangSong_GB2312;font-size:12px;">NSData *encodedObj = [NSKeyedArchiver archivedDataWithRootObject:obj]; //obj爲要傳遞的對象
  NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
  [defaults setObject:encodedObj forKey:@"obj"];</span>

    在A類 NavigationControllerDelegate 代理方法中解歸檔數據 

<span style="font-family:FangSong_GB2312;font-size:12px;">- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSData *objData = [defaults objectForKey:@"obj"];
    OBJ *obj = [NSKeyedUnarchiver unarchiveObjectWithData:objData];
}</span>

1.上面之所以要先將自定義類的對象obj進行歸檔是因爲 NSUserDefault 只能保存NSArrayNSDictionaryNSStringNSDataNSNumber, 和 NSDate ;因此自定義類要實現NSCoding協議,但只實現協議,直接使用[defaults setObjcect:obj forKey:@"obj"]會導致crash。

2.因爲我只要數據對象從 C 到 A 傳遞一次,所以在 A 得到 C 中的 objcect 之後立即刪除了 userDefaults 中的對象,減少錯誤的可能性。

3.其他方式還沒有試或沒有實現,如果您有好的方法,煩請指點。


參考文章:

1.Attempt to set a non-property-list object as an NSUserDefaults [點擊打開鏈接

2.NSUserDefaults讀取和寫入自定義對象 [點擊打開鏈接

3.刪除UserDefault裏某個object致app crash的解決過程點擊打開鏈接

4.How to PASS data using CORE DATA among THREE ViewControllers on iOS 7點擊打開鏈接

5.ViewController之間如何傳值點擊打開鏈接
6.iOS開發系列-視圖切換[點擊打開鏈接

7.iOS頁面間傳值的方式(NSUserDefault/Delegate/NSNotification/Block/單例)[點擊打開鏈接


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章