UserDefaultsってナンデスカ?
UserDefaultsとは、iosアプリ内にデータを保存する方法の一つです。
「これってDBに保存しなくても良いんじゃね?手元に置いていた方が便利じゃね?」
といった、なんか「ちょっとした」データや情報を取り扱う際に利用するらしいです。
今回、アプリを開発しているときに以下のような仕様で機能を実装したかったのですが、
UITextFieldに文字入力 → アプリ再起動 → UITextFieldにデータを表示
javascriptならlocalstorageでチョイチョイって出来ちゃうけど、swiftはどうなのよ?
って事で取りかかったら意外とハマりまくったので、
誰でも使えるような説明を心掛けてアプトプットを兼ねて書き記します。
注)ちなみに保存したのは文字列だから他の型を保存したい場合は適宜変更が必要かと!!
まずはこの2つを理解しよう。
UserDefaultsを使用してデータのやり取りする際には、
もちろん以下の手順を踏むことになる。
①データを保存する
userDefaults.set(ほにゃらら)
②保存したデータを読み込む
userDefaults.object(ほにゃらら)
そして上記を踏まえて,
UITextFieldに文字入力 → アプリ再起動 → UITextFieldにデータを表示
こいつを実装します。
ViewController.swift
import UIKit
//UITextFieldDelegate も付けてあげよう。
class ViewController: UIViewController, UITextFieldDelegate {
//(主人公)こいつに入力した値をアプリ再起動しても、こいつに出力される
@IBOutlet var workPlaces:UITextField!
//①なんでも良いから初期値として設定しておく。
var testText:String = "default"
//②UserDefaults のインスタンス
let userDefaults = UserDefaults.standard
//ページが開かれた時に一番最初に動作するのがこいつ。
override func viewDidLoad() {
super.viewDidLoad()
// textFiel の情報を受け取るための delegate を設定
//今回こいつを書いてなくて時間を費やした。
workPlaces.delegate = self
// デフォルト値
userDefaults.register(defaults: ["DataStore": "default"])
workPlaces.text = readData()
}
//この関数がviewdidload時に読み込まれて保存したデータの読み込み作業をしている。
func readData() -> String {
// Keyを指定して読み込み
let str: String = userDefaults.object(forKey: "DataStore") as! String
return str
}
//viewDidLoad()内でworkPlaces.delegateをきちんと書いていないと、この関数が動作しない。
//ここはシュミレーターのreturnキーを押した時に動く。
func textFieldShouldReturn(_ textField: UITextField) -> Bool{
//(主人公)の内容を①へ代入。
testText = workPlaces.text!
workPlaces.text = testText
// 特定のUITextFieldやUITextViewの状態を変更することができる
workPlaces.resignFirstResponder()
//(保存したいデータ)を引数として以下の関数へ
saveData(str: testText)
return true
}
//ここの関数内のuserDefaults.setで保存している。
func saveData(str: String){
// Keyを指定して保存
userDefaults.set(str, forKey: "DataStore")
}
//memory warningが発生したときに呼び出されるファンクション
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
まとめ
自分としてはclassにUITextFieldDelegateを追記する必要性や、
override func viewDidLoad()の中に追記したこいつを → workPlaces.delegate(デリゲート)
なぜ必要なのか体感出来た良い機会でした。