見出し画像

【徒然iOS】気ままにUIKit109〜UserDefaults〜

概要

このマガジンは四十を過ぎたおっさんが、

を参考にStoryboardでiOSアプリを完全に趣味で楽しんでいるだけな記事を気ままに上げてます。

今回

をハイ、レッツゴ🕺

前準備

念の為、

  1. バックアップ

  2. 新規クラスを追加

  3. メニュービューと新規ビューを追加

  4. 記事に載ってるテスト用プロジェクトと再現させる

をいつもどおりやってから本題へ💃

とりあえず、こんな感じかなと💦

本題

NSUserDefaultsとは、

アプリで入力、編集したデータを端末に保存する機能

👉てことなんで、今から、入力した値を保存させるコードを組み込んでみる💃

⒈コード組み込み

//
//  ViewController.swift
//
import UIKit
class ViewController: UIViewController,UITextFieldDelegate{
    @IBOutlet weak var testLabel: UILabel!
    @IBOutlet weak var testTextField: UITextField!
    let userDefaults = NSUserDefaults.standardUserDefaults()
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()
        //デリゲート先を自分に設定する
        testTextField.delegate = self
        //文字列が保存されている場合はラベルに文字列を設定する。
        if let labelText = userDefaults.stringForKey("labelText") {
            testLabel.text = labelText
        }
    }
    //Returnキー押下時の呼び出しメソッド
    func textFieldShouldReturn(textField:UITextField) -> Bool {
        //キーボードをしまう
        self.view.endEditing(true)
        //テキストフィールドの文字列をラベルに設定する。
        testLabel.text = testTextField.text
        //ラベルの文字列を保存する。
        userDefaults.setObject(testLabel.text, forKey:"labelText")
        //plistファイルへの出力と同期する。
        userDefaults.synchronize()
        return false
    }
}

を参考に、要は

    let userDefaults = NSUserDefaults.standardUserDefaults()
        //文字列が保存されている場合はラベルに文字列を設定する。
        if let labelText = userDefaults.stringForKey("labelText") {
            testLabel.text = labelText
        }
        //ラベルの文字列を保存する。
        userDefaults.setObject(testLabel.text, forKey:"labelText")
        //plistファイルへの出力と同期する。
        userDefaults.synchronize()

を追加すればいいだけっぽいので〜〜〜

今回のコード(基本)

class UserDefaultsViewController: UIViewController, UITextFieldDelegate {
    
    let userDefaults = UserDefaults.standard
    @IBOutlet weak var myTextField: UITextField!
    @IBOutlet weak var myLabel: UILabel!
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()
        //デリゲート先を自分に設定する
        myTextField.delegate = self
        //文字列が保存されている場合はラベルに文字列を設定する。
        if let labelText = userDefaults.string(forKey: "labelText") {
            myLabel.text = labelText
        }
    }
    //Returnキー押下時の呼び出しメソッド
    func textFieldShouldReturn(_ textField:UITextField) -> Bool {
        //キーボードをしまう
        self.view.endEditing(true)
        //テキストフィールドの文字列をラベルに設定する。
        myLabel.text = myTextField.text
        //ラベルの文字列を保存する。
        userDefaults.set(myLabel.text, forKey:"labelText")
        //plistファイルへの出力と同期する。
        userDefaults.synchronize()
        return false
    }
}

⒉シミュレータで実行

最初の入力〜〜〜
一つ前の画面に戻って〜〜〜
開き直すと、さっき入力した文字が残ってる感じ👀

保存できるデータ型

⒈コード組み込み

ここはコードだけで済ませる〜〜〜!
実機で試したけど、コンソール出力もしなかったので、あんまり意味がなかった〜〜〜

//
//  ViewController.swift
//
import UIKit
class ViewController: UIViewController,UITextFieldDelegate{
    @IBOutlet weak var testLabel: UILabel!
    @IBOutlet weak var testTextField: UITextField!
    let userDefaults = NSUserDefaults.standardUserDefaults()
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()
        //Bool型のデータを保存、読込
        userDefaults.setObject(true, forKey: "testBool")
        let result1 = userDefaults.boolForKey("testBool")
        //Int型のデータを保存、読込
        userDefaults.setInteger(7, forKey: "testInt")
        let result2 = userDefaults.integerForKey("testInt")
        //Float型のデータを保存、読込
        userDefaults.setFloat(1.23, forKey: "testFloat")
        let result3 = userDefaults.floatForKey("testFloat")
        //Double型のデータを保存、読込
        userDefaults.setDouble(4.56, forKey: "testDouble")
        let result4 = userDefaults.doubleForKey("testDouble")
        //String型のデータを保存、読込
        userDefaults.setObject("テスト", forKey: "testString")
        let result5 = userDefaults.stringForKey("testString")
        //String型配列のデータを保存、読込
        userDefaults.setObject(["値1","値2"], forKey: "testStringArray")
        let result6 = userDefaults.stringArrayForKey("testStringArray")
        //Dictionary型のデータを保存、読込
        userDefaults.setObject(["キー":"値"], forKey: "testDictionary")
        let result7 = userDefaults.dictionaryForKey("testDictionary")
        //NSURL型のデータを保存、読込
        userDefaults.setURL(NSURL(string: "http://www.test.co.jp"), forKey: "testURL")
        let result8 = userDefaults.URLForKey("testURL")
        //配列データを保存、読込
        userDefaults.setObject([123,"テスト"], forKey: "testArray")
        let result9 = userDefaults.arrayForKey("testArray")
        //Object型のデータを保存、読込
        userDefaults.setObject("テスト", forKey: "testObject")
        let result10 = userDefaults.objectForKey("testObject")
        //NSData型のデータを保存、読込
        let str = "NSData型をテストします"
        let data = NSData(data: str.dataUsingEncoding(NSUTF8StringEncoding)!)
        userDefaults.setObject(data, forKey: "testNSData")
        let result11 = NSString(data:userDefaults.dataForKey("testNSData")!, encoding:NSUTF8StringEncoding)
        print("Bool:\(result1)")
        print("Int:\(result2)")
        print("Float:\(result3)")
        print("Double:\(result4)")
        print("String:\(result5!)")
        print("String配列:\(result6!)")
        print("Dictionary型:\(result7!)")
        print("NSURL型:\(result8!)")
        print("配列:\(result9!)")
        print("オブジェクト型:\(result10!)")
        print("NSData型:\(result11!)")
    }
}

を参考に、

今回のコード(まとめ)

class UserDefaultsViewController: UIViewController, UITextFieldDelegate {
    
    let userDefaults = UserDefaults.standard
    @IBOutlet weak var myTextField: UITextField!
    @IBOutlet weak var myLabel: UILabel!
    //最初からあるメソッド
    override func viewDidLoad() {
        super.viewDidLoad()
        //デリゲート先を自分に設定する
        myTextField.delegate = self
        //文字列が保存されている場合はラベルに文字列を設定する。
        if let labelText = userDefaults.string(forKey: "labelText") {
            myLabel.text = labelText
        }
        //Bool型のデータを保存、読込
        userDefaults.set(true, forKey: "testBool")
        let result1 = userDefaults.bool(forKey: "testBool")
        //Int型のデータを保存、読込
        userDefaults.set(7, forKey: "testInt")
        let result2 = userDefaults.integer(forKey: "testInt")
        //Float型のデータを保存、読込
        userDefaults.set(1.23, forKey: "testFloat")
        let result3 = userDefaults.float(forKey: "testFloat")
        //Double型のデータを保存、読込
        userDefaults.set(4.56, forKey: "testDouble")
        let result4 = userDefaults.double(forKey: "testDouble")
        //String型のデータを保存、読込
        userDefaults.set("テスト", forKey: "testString")
        let result5 = userDefaults.string(forKey: "testString")
        //String型配列のデータを保存、読込
        userDefaults.set(["値1","値2"], forKey: "testStringArray")
        let result6 = userDefaults.stringArray(forKey: "testStringArray")
        //Dictionary型のデータを保存、読込
        userDefaults.set(["キー":"値"], forKey: "testDictionary")
        let result7 = userDefaults.dictionary(forKey: "testDictionary")
        //NSURL型のデータを保存、読込
        userDefaults.set(NSURL(string: "http://www.test.co.jp") as URL?, forKey: "testURL")
        let result8 = userDefaults.url(forKey: "testURL")
        //配列データを保存、読込
        userDefaults.set([123,"テスト"] as [Any], forKey: "testArray")
        let result9 = userDefaults.array(forKey: "testArray")
        //Object型のデータを保存、読込
        userDefaults.set("テスト", forKey: "testObject")
        let result10 = userDefaults.object(forKey: "testObject")
        //NSData型のデータを保存、読込
        let str = "NSData型をテストします"
        let data = NSData(data: str.data(using: String.Encoding.utf8)!)
        userDefaults.set(data, forKey: "testNSData")
        let result11 = NSString(data:userDefaults.data(forKey: "testNSData")!, encoding:NSUTF8StringEncoding)
        print("Bool:\(result1)")
        print("Int:\(result2)")
        print("Float:\(result3)")
        print("Double:\(result4)")
        print("String:\(result5!)")
        print("String配列:\(result6!)")
        print("Dictionary型:\(result7!)")
        print("NSURL型:\(result8!)")
        print("配列:\(result9!)")
        print("オブジェクト型:\(result10!)")
        print("NSData型:\(result11!)")
    }
    //Returnキー押下時の呼び出しメソッド
    func textFieldShouldReturn(_ textField:UITextField) -> Bool {
        //キーボードをしまう
        self.view.endEditing(true)
        //テキストフィールドの文字列をラベルに設定する。
        myLabel.text = myTextField.text
        //ラベルの文字列を保存する。
        userDefaults.set(myLabel.text, forKey:"labelText")
        //plistファイルへの出力と同期する。
        userDefaults.synchronize()
        return false
    }
}

てな感じかな💦
ま、なんかの参考程度に〜〜〜
サイト記事については、以上🕺

ブラッシュアップ

アカウント入力画面っぽく

てな感じに変更して〜〜〜

地球儀ボタンを追加

てな感じで💦

記事公開後、

ハイ、完了💃
実機も問題なし🕺

今回のポイント

UserDefaultsについては、これまでやった色々な本でもあまり出てきてなかったり、出てきてても、今回の記事くらい簡単なモノが多いんだけど、
これまでの記事で何回か紹介したSwiftUIの本、

だと、サンプルが豊富に出されていて、しかもそれだけで結構、何でもできるので、次から入るCoreDataと比べても決してバカにできない機能なんだよね〜〜〜。最近は触れてるかもしれないけど、日本語の市販本だとSwiftUIも同様に、

UserDefaultsを管理する@AppStrorage

ってプロパティラッパー自体があまり紹介されていなかったりしてた💦

イメージ的には、

  • CoreData : データモデルを用意して、色々と保存なんかをするフレームワーク

  • UserDefaults : キーを自分で設定して、データを簡単に管理できる

って感じかな🤔
*あくまでもイメージだけど、、、💦

Apple公式

さてと、次回は

をレッツゴする🕺

ここから先の記事は、正常に既に動かなくなってることが多いと思うので、
あまり期待しないでね〜〜〜〜

わかっていたことではあるが、

UIKitでここまでのビューを組み込むなんてこと自体が、普通のアプリ開発ではあまりないと思うので、

シミュレータや実機でサクサク動きはするんだけど、

Storyboardの編集が、相当重たい💦

本編のビュー構築編に入った時点でも相当、重たかったからね〜〜〜
ま、こういうことも、やったことない人とかの何かの参考になるかもしれないので、これまでも包み隠さず書いてってる🕺

2023/4/19追記

で書いたとおりなんだけど、CoreData周りで予期せぬバグが、発生し始めたので、
元々、そうしよっかなあ〜〜〜と当初は考えていたので、

に、CoreData周りの記事は移動しました💦

なので、このマガジンの

【徒然iOS】気ままにUIKit

シリーズの内容としては、今回でグランドフィナーレになります〜〜〜〜🕺
いやあ、109本の記事は長かった🥹

UIKitの開発は、今後、個人としてはやる気はないけど、Xcode14、iOS16の現在では最新環境で動かしてるので、何かの参考になれば幸い〜〜〜〜!

ビュー自体もちょっと作り替えて、

こんな感じになりました💦

後は、次の記事で最終回として、

今回の活動の総まとめでも書こうかなと、、、

  • この活動を始めた理由

  • ダッシュボードのアクセス状況

  • 各機能を盛り込んだビューをひとつのプロジェクトに繋いだ利点

などなど。

欲しい人もいるかも知れないけど、

実際に記事を作る時に作り込んだHajiHajiProjectファイル自体を、
公開しようかどうかは、結構前から検討中🤔

この記事が気に入ったらサポートをしてみませんか?