PGメモ

非エンジニアの記録

データを保存する[iOS 8/X code6]

http://www.flickr.com/photos/44718928@N00/8016192302
photo by justgrimes


swiftでデータを保存したい時にどうすればよいか。
ここでは一番簡単なNSUserDefaultsを使います。

新規プロジェクトをSingleView Applicationで作る

今回は最小の実装にするため、SingleView Applicationにてプロジェクトを作成します。
名前は適当に「saveSample」にでもします。

オブジェクトを配置

次にストーリーボードにオブジェクトを配置していきます
今回必要なものは
1. 保存用テキストフィールド
2. 保存用ボタン
3. 読み込み用ラベル
4. 読み込み用ボタン

オブジェクトの連携

まずはテキストフィールドとラベルをctrlを押しながらドラッグして
コントローラーとひも付けます。ConnectionはOutlet。
名前ですが
保存用テキストフィールドが「textField」
読み込み用ラベルが「label」
とします

次はボタンのアクションです。
こちらも同様にctrlを押しながらドラッグします。
ConnectionはActionにして
保存用ボタンが「save」
読み込み用ボタンが「load」
としてください。

ソースコードは下記のようになっていると思います

class ViewController: UIViewController {
     
    // TextFieldのアウトレット
    @IBOutlet weak var textField: UITextField!
     
    // Labelのアウトレット
    @IBOutlet weak var label: UILabel!
     
     
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }
 
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
 
    // saveボタンのアクション
    @IBAction func saveButton(sender: AnyObject) {
    }
 
    // loadボタンのアクション
    @IBAction func loadButton(sender: AnyObject) {
    }
 
}

アクションを追記

あとは保存、読み込みを実装するだけです。
まずは保存

// saveボタンのアクション
@IBAction func saveButton(sender: AnyObject) {
    // データ保存処理
     
    // NSUserDefaultsインスタンスの生成
    let userDefaults = NSUserDefaults.standardUserDefaults()
 
    // キー: "saveData" , 値: "<textFieldの入力値>" を格納。(idは任意)
    userDefaults.setObject(textField.text, forKey: "saveData") 
}


NSUserDefaultsとは何か
アプリ固有の設定値を保存することに特化したクラスで
アプリ開発者は NSUserDefaults オブジェクトを通して
Key-Value 形式でデータにアクセスします

データの保存場所の管理は NSUserDefaults オブジェクトがすべて行ってくれます。
実際のデータは ホーム/Library/Preferences 以下にプロパティリスト形式で保存されます。



次に読み込み

// loadボタンのアクション
@IBAction func loadButton(sender: AnyObject) {
    // データ読み込み処理
     
    // NSUserDefaultsインスタンスの生成
    let userDefaults = NSUserDefaults.standardUserDefaults()
     
    // キーが"saveText"のStringをとります。
    var loadText : String! = userDefaults.stringForKey("saveData")
     
    // labelに表示
    label.text = loadText
     
}

これで実行し、テキストフィールドに値を入れてsaveを押すと値が保存され
loadを押すと先ほどの値がラベルに表示されるはずです。

意外と簡単ですね。