phicdy devlog

Androidアプリ開発やその他技術系の記事をたまに書きます

AndroidとかiOSとかモバイル多め。その他技術的なことも書いていきます。

【iOS, Objective-C】 NSUserDefaultsを使って簡単なデータを保存する

iOSではデータを保存する方法が何種類かある。
・ファイル
・データベース(SQLite)
・Core Data
・NSUserDefaults
その中で一番簡単にデータを保存できるのがNSUserDefaultsである。
NSUserDefaultsではキーと値のセットで値が保存できる。
そのため、複雑な構造のデータの保存にはあまり向いていないが、オプションやフラグの値の保存程度ならば簡単に実装できる。

[[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"key"];
Bool value = [[NSUserDefaults standardUserDefaults]boolForKey:@"key"] // YES

setBoolではBoolの値が保存できるが、それ以外の値用のメソッドも用意されている。

メソッド保存できる値
setObject id
setInteger NSInteger
setURL NSURL
setFloat float
setDouble double
setBool Bool

例えばスイッチが1つあってそのオン/オフの状態を保存する場合、以下のようになる。

#import "ViewController.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UISwitch *switch;
@property (weak, nonatomic) NSString *switchKey;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    _switchKey = @"switchKey";

    _switch.on = NO;
    // 保存した値を読み込み
    if ([[NSUserDefaults standardUserDefaults]boolForKey:_switchKey]) {
        _switch.on = YES;
    }
   
    // スイッチの状態が変わったときに呼ばれる先を指定
    [_switch addTarget:self action:@selector(switchDidChange) forControlEvents:UIControlEventValueChanged];
}

- (void)switchDidChange {
	// スイッチの状態が変わったら現在のスイッチの状態をNSUserDefaultsに保存
    if (_switch.on == YES) {
        [[NSUserDefaults standardUserDefaults]setBool:YES forKey:_switchKey];
    }else {
        [[NSUserDefaults standardUserDefaults]setBool:NO forKey:_switchKey];
    }
}


スクリーンショット

f:id:phicdy:20150530185951p:plain

実際にスイッチを切り替えてからアプリを開き直すと、スイッチの状態が保存されていることが確認できる。