Swift,Objective-Cプログラミング ~ iOS ~

Objective-C,Swift,Apple Watchなどのプログラミング

【iOS Swift入門 #303】RxRealmを使って、設定変更後、即時に表示に反映するサンプル

はじめに

  • RxRealmはRealmをRxSwiftでラップしている
  • Realmのデータ変更をObservableで取得できるところが便利

この記事について

Realmに保存された設定値を監視し、変更されたら、即時に表示を即時に変更することをやりたい

RxRealm

github.com

完成イメージ

  1. 初期表示 f:id:fjswkun:20170717164058p:plain

  2. 左バーボタンをタップ f:id:fjswkun:20170717164136p:plain

「青」をタップ

  1. 「青」タップ後の表示 f:id:fjswkun:20170717164218p:plain

  2. 右バーボタンをタップ f:id:fjswkun:20170717164346p:plain

「緑」をタップ

  1. 「緑」タップ後の表示 f:id:fjswkun:20170717164426p:plain

実装

ナビゲーションバーに関する設定値をRealmに保存する。設定が変更されたら、即時にその設定を表示に反映させる

import UIKit
import RealmSwift
import RxRealm
import RxSwift

class ViewController: UIViewController {
    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        do{
            let realm = try Realm()
            
            // ナビゲーションバーの設定値をサブスクライブ
            let navigationBarColor = realm.objects(Setting.self).filter("key=%ld", SettingKey.navigationBarColor.rawValue).first!
            Observable.from(object: navigationBarColor)
                .map{ color in return ColorParam(rawValue: color.param)?.uicolor ?? ColorParam.empty.uicolor }
                .subscribe(onNext: { self.navigationController?.navigationBar.backgroundColor = $0 })
                .disposed(by: disposeBag)

            // tintカラーの設定値をサブスクライブ
            let tintColor = realm.objects(Setting.self).filter("key=%ld", SettingKey.tintColor.rawValue).first!
            Observable.from(object: tintColor)
                .map{ color in return ColorParam(rawValue: color.param)?.uicolor ?? ColorParam.empty.uicolor }
                .subscribe(onNext: { self.navigationController?.navigationBar.tintColor = $0 })
                .disposed(by: disposeBag)
            
        }catch(let e){ print(e.localizedDescription) }
    }

    @IBAction func tapLeftBarButton(_ sender: UIBarButtonItem) {
        let sheet = UIAlertController(title: "上部バーの背景色の変更", message: "変更する色を選択してください", preferredStyle: .actionSheet)
        let actions = ColorParam.all.map{ param -> UIAlertAction in
            let action = UIAlertAction(title: param.name, style: .default){ _ in
                let selected = Setting()
                selected.key = SettingKey.navigationBarColor.rawValue
                selected.param = param.rawValue
                
                do{
                    let realm = try Realm()
                    try realm.write {
                        realm.add(selected, update: true)
                    }
                }catch(let e){
                    print(e.localizedDescription)
                }
            }
            return action
        }
        actions.forEach{ sheet.addAction($0) }
        present(sheet, animated: true, completion: nil)
    }

    @IBAction func tapRightBarButton(_ sender: UIBarButtonItem) {
        let sheet = UIAlertController(title: "上部バーのテキストカラーの変更", message: "変更する色を選択してください", preferredStyle: .actionSheet)
        let actions = ColorParam.all.map{ param -> UIAlertAction in
            let action = UIAlertAction(title: param.name, style: .default){ _ in
                let selected = Setting()
                selected.key = SettingKey.tintColor.rawValue
                selected.param = param.rawValue
                
                do{
                    let realm = try Realm()
                    try realm.write {
                        realm.add(selected, update: true)
                    }
                }catch(let e){
                    print(e.localizedDescription)
                }
            }
            return action
        }
        actions.forEach{ sheet.addAction($0) }
        present(sheet, animated: true, completion: nil)
    }
    
}

サンプル

SampleRxRealm.zip - Google ドライブ

Swift

入門書籍

絶対に挫折しない iPhoneアプリ開発「超」入門 増補改訂第5版
プログラミングが初めて!という人が小さなアプリを作ることで、アプリ開発を学ぶことができます。
「Swiftだけでなく、プログラミング自体が初めてなんだけど、どの本が良い?」と聞かれたときには、
この書籍をおすすめしています。

本気ではじめるiPhoneアプリ作り Xcode 8.x+Swift 3.x対応 (ヤフー黒帯シリーズ)
アプリ開発からApp Storeへの公開までの一通りを学ぶことができます。
入門書を2冊、3冊を読んだあとでこの書籍を読むとかなりの実力アップを感じることができます。

ただし、一通り学ぶことができますが、プログラミング初めてでこの書籍を選ぶことはオススメできません。
最初の方の内容はプログラミング初心者には理解が難しく、そこで勉強をやめてしまう可能性がありそうだと感じます。

Swiftポケットリファレンス
辞書として1冊は持ってても良い。

仕事でやれるレベルになるために

初心者から仕事でやれるレベルになるためにオススメできる日本語書籍がみつかりませんでした。
英語は苦手でも、書籍に書かれているソースはやさしく、読み進めることができます。

The iOS Apprentice (英語サイト・英語書籍)
Swift Apprentice (英語サイト・英語書籍)

平均的プログラマーを超えるために

詳解Swift 第3版
Swift3の書籍。第1版、第2版にもお世話になっています。
Swiftの文法についてとても詳しく書いてあります。

Ray Wenderlich | Tutorials for iPhone / iOS Developers and Gamers
QiitaのSwiftに関する記事