Objective-C的數據存儲和參數傳遞

最簡單的本地數據存儲——NSUserDefaults

NSUserDefaults提供了一系列方法,能夠存儲一些基本數據類型或對象,具體用法有如下幾個方法:ide

  • 初始化方法:靜態單例方法,得到默認的本地存儲區
+(NSUserDefaults * _Nonnull) standardUserDefaults
  • 添加和修改鍵值
-(void) setObject:(nullable id) forKey:(nonnull NSString *)
  • 除了setObject:forKey:方法以外還有setBool、setURL、setfloat等方法,用於添加對應的鍵值。傳入的字符串做爲鍵名,以便於區分和在讀取的時候使用。
  • 讀取鍵值
-(id _Nullable) objectForKey:(nonnull NSString *)
  • 其中參數就是在調用setObject:forKey:時候所傳入鍵名,一樣地也有boolForKey等對用類型的方法。返回值就是以前存入的值。
  • 在存儲對象時的注意事項:在存儲對象時,若是不是NSData、NSArray、NSMutableArray、NSURL這樣的類型,要注意必須先轉化爲NSData才能存儲:
+(NSData * _Nonnull)archivedDataWithRootObject:(nonnull id)
  • 這個方法是NSKeyedArchiver的一個靜態方法,經過這個方法能夠將任意遵循NSCoding協議的對象轉化爲NSData。而後再將NSData存入NSUserDefault便可。
  • 讀取的時候直接讀取到的也是NSData數據,須要轉化爲原來的數據
+(id _Nullable)unarchiveObjectWithData:(nonnull NSData *)

這個方法是NSKeyedUnarchiver的靜態方法,經過這個方法能夠將NSData還原爲原來的數據,這個方法是可失敗的,返回值多是nil。函數

參數傳遞的兩種方式

  • 在多視圖程序中,視圖之間的參數傳遞顯得尤其重要,剛纔提到了NSUserDefaults的使用,顯然這樣的方式能夠用於數據傳遞。這種傳遞方式比較適合較多視圖的參數傳遞,例如全部視圖都須要讀取夜間模式的狀態,大多數視圖須要讀取用戶是否登錄等,這樣的數據用NSUserDefaults進行保持比較合適。而只在兩個視圖之間的參數傳遞,可使用相似於函數參數傳遞的方式,這種方式依賴於協議和Segue跳轉時候的一個方法來實現,這個方法有以下定義:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
  • 這個方法如此重要,以致於系統在默認建立的ViewController視圖類的文件中都會提到。它是在加載一個Segue的時候調用,並且是在跳轉以前調用的,根據Apple官方的說明,可使用 [segue destinationViewController]來得到跳轉後的視圖控制器,得到以後,能夠調用這個視圖控制器的方法進行參數傳遞。這時候推薦將該方法定義爲協議。例若有以下的用法:
@protocol DataTransferDelegate <NSObject>
//該協議規定了視圖之間參數傳遞的方式
@optional
-(void)transferBoolValue:(BOOL)state From:(id)sender;
-(void)transferString:(NSString *)str From:(id)sender;
@end
  • 而後在跳轉前的視圖控制器類中編寫如下方法:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"ToLogInSegue"]) {
    //先對identifier進行判斷
        LogInTestViewController *viewController=[segue destinationViewController];
    //得到跳轉後的視圖控制器
        [viewController transferBoolValue:([_touchidswitch isOn]) From:(self)];
    //調用用於傳遞參數的協議方法
    }
  }
  • 注意,由於這個方法被全部可加載的Segue所共用,因此在有多個Segue定義的時候,推薦先判斷下標示符。
  • 最後,在跳轉後的標識符中,使用協議方法來接收參數便可。
相關文章
相關標籤/搜索