脳汁portal

アメリカ在住(だった)新米エンジニアがその日学んだIT知識を書き綴るブログ

SwiftによるiPhoneアプリ開発入門(超初歩)その10 -データの保存(ユーザデフォルト)-

今回はデータの保存ができるアプリを開発します。
iOSではアプリのインストール時に、アプリ毎のサンドボックスが用意されます。各アプリは通常、サンドボックス内のファイルへのみアクセスが可能です。そのため、アプリ内の情報を他のアプリから盗まれたり、逆にシステムの重要なファイルを誤って破壊することを防ぐことができます。

イメージ

f:id:portaltan:20150727211936p:plain

コンテナ

サンドボックス内には用途により複数のコンテナが作成されます。

ディレクトリ


コンテナ ディレクトリ名 説明
Bundler Container アプリ名.app アプリ本体と、そこに含まれるリソース格納用ディレクトリ
Data Container Documents ユーザの作成したコンテンツ用ディレクトリ
iTunesのバックアップ対象
Documents/Inbox 他のアプリから受け取ったデータを保存するディレクトリ
iTunesのバックアップ対象
Library ユーザの作成したコンテンツ以外の格納用ディレクトリ
iTunesのバックアップ対象
Library/Cache キャッシュ用ディレクトリLibararu以下でもこのディレクトリはバックアップ対象にならない
tmp アプリ起動中のみデータを保持する一時ファイル用ディレクトリ

ユーザデフォルトの利用

  • アプリ内の設定情報を保存しておくためのもの
  • フォントサイズとか背景色とか、ユーザが選択した背景とか
  • 大量のデータを保存するには向かない
  • 利用するにはNSUserDefaultクラス
  • 格納先やファイル形式などを意識する必要はない
  • key と値で管理

実際に実装

1, Tabbed Applicationとしてアプリを作成

f:id:portaltan:20150727204201p:plain

2, ストーリーボード上に二つのシーンが作成されるので、SecondViewシーンにSegmented Controlを配置してプロパティを設定する

f:id:portaltan:20150727204602p:plain

  • segment0 => White
  • segment1 => Gray
  • segment2 => Brown
  • segment3 => Green
3, SecondViewControllerへsegmentからアウトレット接続(プログラムからの値の設定)とアクション接続(選択時に処理の呼び出し)の両方をしておく。

f:id:portaltan:20150727204944p:plain

f:id:portaltan:20150727204949p:plain

4, FirstViewControllerへ処理を実装
  • 背景色の設定
    //利用する背景色を定義
    enum BackgroundColorType: Int {
        case White = 0
        case Gray, Brown, Green
    }
  • データを取得して利用する処理を実装
    // 画面が表示される前に、毎回実行されるライフサイクルメソッド
    override func viewWillAppear(animated:Bool) {
        
        // NSUserDefaultsオブジェクトを取得
        let defaults = NSUserDefaults.standardUserDefault()
        
        // NSUserDefaultsに格納された値を取得
        let colorIndex = defaults.integerForKey("colorIndex")
        
        // 背景色にするためのUIColor
        let selectedColor: UIColor
        
        //取得した値を元に列挙型を生成し、たいおうする値がある場合のみ背景色を設定
        if let color = BackgroundColorType(rawValue: colorIndex) {
            
            //取得した設定値を元にビューの背景色を設定
            switch color {
            case .White:
                selectedColor = UIColor.whiteColor()
            case .Gray:
                selectedColor = UIColor.grayColor()
            case .Brown:
                selectedColor = UIColor.browncolor()
            case .Green:
                selectedColor = UIColor.greenColor()
            }
            
            // 背景色を設定
            self.view.backgroundColor = selectedColor
        }
    }
5, SecondViewControllerを実装
  • SegmentedControlの設定
    @IBAction func selectColorSegment(sender: UISegmentedControl) {
        
        //セグメントの選択値を取得
        let selectedIndex = sender.selectedSegmentIndex
        
        // NSUserDefaultsオブジェクトを取得
        let defaults = NSUserDefaults.standardUserDefaults()
        
        // NUUserDefaultsにセグメントの選択値を保存(キーは"clockIndex"を指定)
        defaults.setInteger(selectedIndex, forKey: "colorIndex")
        
        // 設定値をファイルシステムへ書き込み
        if defaults.synchronize() {
            println("設定値の保存成功")
        }
    }
  • 画面表示時に、前回終了時と同じ画面を表示させる実装
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 画面表示時にあらかじめ、以前の設定値を元にセグメントの項目を設定しておく
        let defaults = NSUserDefaults.standardUserDefaults()
        let colorIndex = default.integerForKey("colorIndex")
        colorSegment.selectedSegmentIndex = colorIndex
    }

これで一度アプリを落としても、前回の選択した値を利用するアプリができました。