[Realm][Swift4対応 完全保存版] 1.CocoaPodsによるRealmのインストールとプロジェクトの作成方法

はじめに

本サイトのアクセスログを見ると、Swiftで使用できるデータベースフレームワーク「Realm」の記事への参照が多いようです。

そこで、もっと詳細な説明を加えた、Swif4向けの完全保存版を作成することとしました。

第1回目となる今回は、プロジェクトを作成し、Realmをプロジェクトに組み込むまでを説明します。

なお、過去記事にてCarthageによるRealmの導入方法について説明しましたが、今回はCocoaPodsによるRealmのインストール方法について説明します。

※筆者としては、CocoaPodsによるRealmの組み込みの方が簡単だと感じました。

なお、CocoaPodsのインストール方法については、「CocoaPodsの導入」の記事を参照してください。

環境

Xcode:9.4.1
Swift:4.1.2
Realm:3.7.4

目次

  1. プロジェクトを作成する
  2. podファイルを作成する
  3. podファイルを編集する
  4. Realmをインストールする

“[Realm][Swift4対応 完全保存版] 1.CocoaPodsによるRealmのインストールとプロジェクトの作成方法” の続きを読む

[Tips]Swift4での文字列操作

はじめに

どのようなプログラミング言語であっても、文字列操作は頻繁に使用しますし、必要不可欠な技術です。

今回はSwift4における文字列操作について説明します。

環境

macOS High Sierra 10.13.3
Xcode 9.2(9C40b)
Swift 4.0.3

目次

“[Tips]Swift4での文字列操作” の続きを読む

[ライブラリ]Eurekaの行にタグを付けてRow値を取得するには?

はじめに

Eurekaで作成する行には、タグを付けることができます。

今回はタグを付けて、あとからRow値を取得する方法を紹介します。

Eurekaについては、本ブログのメニューから[ライブラリ]-[Eureka]を選択して参照ください。

環境

Xcode:9.4.1
Swift:4.1.2

タグを設定する方法

行にタグを設定するのは簡単です。

tagプロパティに、任意のタグ名を付けるだけです。

以下の例では、tagプロパティに”team”を設定しています。

form
    +++ Section("チーム設定")
    <<< TextRow { row in
        row.tag = "team"
        row.title = "チーム名"
        row.placeholder = "チーム名を入力"
        }

タグを使用して、行に入力された値を取得する方法

タグを使用して値を取得するには、はじめに form.rowBy(tag: タグ名) を使用して行全体の情報を取得します。次にvalueプロパティを使用して値を取得します。

例えば、保存ボタンをタップした時に行の値を取得したい場合は、以下の様にします。

この例では、タグ名「team」を使用して値を取得しています。

// 保存ボタンをタップしたときのアクション
@objc func tappedSaveButton() {
    let teamRow = form.rowBy(tag: "team") as! TextRow
    let name = teamRow.value!
    
    print(name)
}

values()メソッドを使用して値を取得する方法

Formのvaluesメソッドを使用すると、タグが設定されている行の値を全て取得することができます。

以下に例を示します。

この例では、valuesメソッドで全ての行を取得後に、タグ名を指定して任意の行の値を取得しています。

// 全てのRowの値を取得
let values = form.values()
 
// 「team」というタグが設定された行の値を取得する
let name = values["team"] as! String

 

 

 

[Tips]UIAlertControllerでアラートやアクションシートを表示するには?

はじめに

iOSではUIActionControllerを使用して、ポップアップでアラートを表示したり、選択肢(アクションシート)を表示したりして、ユーザーに項目を選択させることができます。

iPhoneにおいては、アラートの表示も選択肢の表示も問題なく動作します。しかし、iPadにおいてはiPhoneと同様の実装を行うと、アラートは動作しますが、選択肢(アクションシート)の表示は落ちてしまいます。

本TipsではiPhoneとiPadでアラートとアクションシートを表示する方法について説明します。

今回作成するサンプルは以下のようなものです。

環境

Xcode:9.4.1
Swift:4.1.2

AlertControllerの使用方法

はじめに、AlertControllerの使用してアラートを表示する方法について説明します。これが基本となります。

Xcodeを起動してSingle View Appプロジェクトを作成します。

次にMain.storyboardを開いてUIButtonを1つ貼り付けます。

続いて、貼り付けたButtonのアクション接続を作成します。

名称は、buttonAlertとしました。

コードはiPhoneもiPadも同一のもので動作します。コード例を以下に示します。

①の部分でUIAlertControllerのインスタンスを作成し、②と③でOKボタンとキャンセルボタンを作成しています。

④で、①で作成したインスタンスにOKボタンとキャンセルボタンを追加し、⑤でアラートの表示をしています。詳細はコード中のコメントを参照してください。

@IBAction func buttonAlert(_ sender: Any) {
    // ①UIAlertControllerクラスのインスタンスを生成する
    // titleにタイトル, messegeにメッセージ, prefereedStyleにスタイルを指定する
    // preferredStyleにUIAlertControllerStyle.alertを指定してアラート表示にする
    let alert: UIAlertController = UIAlertController(
        title: "アラート表示",
        message: "メールを送信します。よろしいですか?",
        preferredStyle: UIAlertControllerStyle.alert)
    
    // ②OKボタンの作成
    // titleにボタンのテキストを、styleにUIAlertActionStyle.defaultを
    // handlerにボタンが押された時の処理をクロージャで実装する
    let okAction: UIAlertAction =
        UIAlertAction(
            title: "OK",
            style: UIAlertActionStyle.default,
            handler:{
                (action: UIAlertAction!) -> Void in
                print("OK")
    })
    
    // ③キャンセルボタンの作成
    // OKボタンと同様に作成
    let cancelAction: UIAlertAction =
        UIAlertAction(
            title: "キャンセル",
            style: UIAlertActionStyle.cancel,
            handler:{
                (action: UIAlertAction!) -> Void in
                print("Cancel")
    })
    
    // ④UIAlertControllerのインスタンスに作成したボタンを追加
    alert.addAction(cancelAction)
    alert.addAction(okAction)
    
    // ⑤アラートを表示
    present(alert, animated: true, completion: nil)
}

上記の実行例を以下に示します。

iPhoneでのActionSheet表示

UIAlertControllerでのアラート表示方法を理解したら、iPhoneにおける選択肢(ActionSheet)の表示方法を理解しましょう。

コード例を以下に示します。この例ではユーザーに「バスケットボール」「野球」「テニス」の選択肢を示し、選択してもらうためのアクションシートを表示します。

はじめに①の部分でUIAlertControllerのインスタンスを生成します。アラートの時との違いは preferredStyle に UIAlertControllerStyle.actionSheet を指定するという部分です。

②では選択肢を作成し、①で作成したインスタンスに追加をしています。アラートのOKボタン作成時のコードとほぼ同様です。

最後に③でアクションシートを表示します。

@IBAction func buttonAlert(_ sender: Any) {
    // ①UIAlertControllerクラスのインスタンスを生成する
    // titleにタイトル, messegeにメッセージ, prefereedStyleにスタイルを指定する
    // preferredStyleにUIAlertControllerStyle.actionSheetを指定してアクションシートを表示する
    let actionSheet: UIAlertController = UIAlertController(
        title: "選択肢を表示",
        message: "好きなスポーツを選択してください",
        preferredStyle: UIAlertControllerStyle.actionSheet)

    // ②選択肢の作成と追加
    // titleに選択肢のテキストを、styleに.defaultを
    // handlerにボタンが押された時の処理をクロージャで実装する
    actionSheet.addAction(
        UIAlertAction(title: "バスケットボール",
                      style: .default,
                      handler: {
                        (action: UIAlertAction!) -> Void in
                            print("バスケットボール")
        })
    )

    // ②選択肢の作成と追加
    actionSheet.addAction(
        UIAlertAction(title: "野球",
                      style: .default,
                      handler: {
                        (action: UIAlertAction!) -> Void in
                        print("野球")
        })
    )
    
    // ②選択肢の作成と追加
    actionSheet.addAction(
        UIAlertAction(title: "テニス",
                      style: .default,
                      handler: {
                        (action: UIAlertAction!) -> Void in
                        print("テニス")
        })
    )

    // ③アクションシートを表示
    present(actionSheet, animated: true, completion: nil)
}

上記の実行例を以下に示します。

iPadでのActionSheet表示

iPadではiPhoneと同様に実装すると落ちてしまいます。

そこで、コードを以下のように実装します。

違いは以下コードの③の部分のみです。

iPadでアクションシートを表示するには、アクションシートを表示するViewと表示位置を指定する必要があります。

Viewは popoverPresentationController?.sourceView に、表示位置は popoverPresentationController?.sourceRect に指定します。このとき表示位置をsender(つまりはアクションシートを表示するために押されたボタン)を指定することで、そのボタンから吹き出しのようにアクションシートが表示されるようになります。

@IBAction func buttonAlert(_ sender: Any) {
    // ①UIAlertControllerクラスのインスタンスを生成する
    // titleにタイトル, messegeにメッセージ, prefereedStyleにスタイルを指定する
    // preferredStyleにUIAlertControllerStyle.actionSheetを指定してアクションシートを表示する
    let actionSheet: UIAlertController = UIAlertController(
        title: "選択肢を表示",
        message: "好きなスポーツを選択してください",
        preferredStyle: UIAlertControllerStyle.actionSheet)

    // ②選択肢の作成と追加
    // titleに選択肢のテキストを、styleに.defaultを
    // handlerにボタンが押された時の処理をクロージャで実装する
    actionSheet.addAction(
        UIAlertAction(title: "バスケットボール",
                      style: .default,
                      handler: {
                        (action: UIAlertAction!) -> Void in
                            print("バスケットボール")
        })
    )

    // ②選択肢の作成と追加
    actionSheet.addAction(
        UIAlertAction(title: "野球",
                      style: .default,
                      handler: {
                        (action: UIAlertAction!) -> Void in
                        print("野球")
        })
    )
    
    // ②選択肢の作成と追加
    actionSheet.addAction(
        UIAlertAction(title: "テニス",
                      style: .default,
                      handler: {
                        (action: UIAlertAction!) -> Void in
                        print("テニス")
        })
    )

    // ③表示するViewと表示位置を指定する
    actionSheet.popoverPresentationController?.sourceView = view
    actionSheet.popoverPresentationController?.sourceRect = (sender as AnyObject).frame
    
    // ④アクションシートを表示
    present(actionSheet, animated: true, completion: nil)
}

③の部分を以下のように変更することで、デバイスを自動的に判断して実行できるようになります。このように記述すればiPhoneでもiPadでも動作させることが可能になります。

デバイスの判定については「[Tips] 使用中のデバイスを判定する」の記事を参考にしてください。

// ③表示するViewと表示位置を指定する(デバイス自動判定版)
if UIDevice.current.userInterfaceIdiom  == .pad {
    actionSheet.popoverPresentationController?.sourceView = view
    actionSheet.popoverPresentationController?.sourceRect = (sender as AnyObject).frame
}

上記の実行例を以下に示します。

ボタンのスタイルについて

最後にボタンのスタイルについて説明します。

ボタンのスタイルは以下に示す3種類を指定することができます。

スタイル 説明
default 標準ボタン用
cancel キャンセルボタン用
destructive 赤文字

必要に応じて選択するようにしましょう。

[ライブラリ] EurekaのPickerRowとPickerInlineRowを使用する方法

はじめに

今回はEurekaのPickerRowとPickerInlineRowの使用方法について説明します。

EurekaのPickerRowやPickerInlineRowは、UIPickerViewに相当するUI部品です。任意の選択肢を表示して、ユーザーに選択させることができます。

Eurekaについては、本ブログのメニューから[ライブラリ]-[Eureka]を選択して参照ください。

作成するサンプルは以下の通りです。

 

環境

Xcode:9.4.1
Swift:4.1.2

PickerRowを使用するには?

PickerRowは、設定画面の中に直接選択肢を表示させることができます。よって選択肢は常に表示されたままとなります。

たとえば、曜日を選択できるようにPickerRowを作成するには、以下のようなコードを記述します。

class EurekaViewController: FormViewController {

    var selectedGender : String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()

        form
            +++ Section("設定")
            <<< PickerRow<String>() { row in
                row.title = "曜日"
                row.options = ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"]
                row.value = row.options.first
            }.onChange {[unowned self] row in
                self.selectedGender = row.value!
                print(self.selectedGender )
            }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

PickerRowの基本書式

<<< PickerRow<表示項目(選択肢)のデータ型>() { row in
    row.options = 選択肢を表す配列
    row.value = row.options.first
}.onChange {[unowned self] row in
    // 値変更時の処理
}

1行目の<>の中には、表示項目のデータ型を指定します。一般的には文字列を表示しますのでStringとします。

2行目のrow.optionsには、文字配列を代入します。ここで代入した値が、選択肢となって表示されます。

3行目のrow.valueは、初期値として選択しておく項目を指定します。

4行目のonChangeには、選択肢が変更された場合の処理を記述します。

※PickerRowはタイトルを設定できないようです。row.titleプロパティを使用してみましたが表示できないことを確認しています。

PickerRowの実行例

上記コードの実行例を以下に示します。

PickerInlineRowを使用するには?

PickerInlineRowは、初期表示時は選択肢が表示されません。タップした時に初めて選択肢が表示されます。

使い方はPickerRowと同じです。コードもPickerRowをPickerInlineRowに変更するだけで同様に使用することができます。参考までに以下にコード例を示します。

class EurekaViewController: FormViewController {

    var selectedGender : String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()

        form
            +++ Section("設定")
            <<< PickerInlineRow<String>() { row in
                row.title = "曜日"
                row.options = ["日曜日","月曜日","火曜日","水曜日","木曜日","金曜日","土曜日"]
                row.value = row.options.first
            }.onChange {[unowned self] row in
                self.selectedGender = row.value!
                print(self.selectedGender )
            }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

PickerInlineRowの基本書式

<<< PickerInlineRow<表示項目(選択肢)のデータ型>() { row in
    row.title = タイトルを表す文字列
    row.options = 選択肢を表す配列
    row.value = row.options.first
}.onChange {[unowned self] row in
        // 値変更時の処理
}

PickerInlineRowは、row.titleでタイトルを設定することができます。

PickerInlineRowの実行例

上記コードの実行例を以下に示します。

 

 

 

[ライブラリ] EurekaのSwitchRowを使用する方法

はじめに

今回は、EurekaライブラリのSwitchRowを使用する方法を説明します。作成するサンプルは以下の通りです。SwitchRowはOn/Offを選択できるようにするUI部品です。

Eurekaについては、本ブログのメニューから[ライブラリ]-[Eureka]を選択して参照ください。

環境

Xcode:9.4.1
Swift:4.1.2

サンプルコード

はじめに、サンプルコードを示します。このサンプルコードは、Wi-FiのOn/Offを選択できるようにするものです(実際にWi-FiのOn/Offをするコードではありません)。

import Eureka
import UIKit

class EurekaViewController: FormViewController {

    var onWiFi : Bool = false
    
    override func viewDidLoad() {
        super.viewDidLoad()

        form
            +++ Section("ネットワーク設定")
            <<< SwitchRow(){ row in
                row.title = "Wi-Fi"
                row.value = true
                }.onChange{[unowned self] row in
                    self.onWiFi = row.value!
                    print(self.onWiFi)
                }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

SwitchRowの基本書式

SwitchRowの基本書式を以下に示します。

<<< SwitchRow() { row in
    row.title = 行タイトルを表す文字列
    row.value = 初期値(Bool型)
}

row.titleは行のタイトルです。必要ない場合は書かなくても構いません。

row.valueは、はじめて表示されたときにOnにしておくかOffにしておくかをBool値で指定します。Onにしたい場合はtrueを設定します。

選択肢を取得する

選択肢が変更された場合は、onChangeのイベントが発生します。onChange関数の中で、最新の選択状態をクラスプロパティに格納しておくようにするとよいです。

選択された値は、row.valueで取得することができます。

実行例

以下に実行例を示します。

[ライブラリ] EurekaのSegmentedRowを使用する方法

はじめに

今回は、EurekaライブラリのSegmentedRowを使用する方法を説明します。作成するサンプルは以下の通りです。SegmentedRowは複数の選択項目の中から1つの項目を選択できるようにするUI部品です。

Eurekaについては、本ブログのメニューから[ライブラリ]-[Eureka]を選択して参照ください。

環境

Xcode:9.4.1
Swift:4.1.2

サンプルコード

はじめに、サンプルコードを示します。このサンプルコードは、好きなくだものを3つ表示して、その中から1つを選ばせるためのSegmentedRowを作成しています。

import Eureka
import UIKit

class EurekaViewController: FormViewController {

    var fruit : String = ""
    
    override func viewDidLoad() {
        super.viewDidLoad()

        form
            +++ Section("くだもの")
            <<< SegmentedRow<String>() { row in
                row.title = "好きなくだもの"
                row.options = ["スイカ","メロン","モモ"]
                row.value = "メロン"
                }.onChange{[unowned self] row in
                    self.fruit = row.value ?? "選択なし"
                    print(self.fruit)
                }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
}

SegmentedRowの基本書式

SegmentedRowの基本書式を以下に示します。

<<< SegmentedRow<表示する値のデータ型>() { row in
    row.title = 行タイトルを表す文字列
    row.options = SegmentedRowに表示する選択肢の配列
    row.value = 初期値
}

書式ですが、「表示する値のデータ型」は基本的にStringを指定します。

row.titleは行のタイトルです。必要ない場合は書かなくても構いません。

row.optionsは、表示する選択肢を配列で記述します。

row.valueは、はじめて表示されたときに選択状態にしたい項目を指定します。指定しない場合は、いずれの項目も選択されていない状態になります。

選択肢を取得する

選択肢が変更されるために、onChangeのイベントが発生します。onChange関数の中で、最新の選択項目をクラスプロパティに格納しておくようにするとよいです。

サンプルコードに示しましたが[unowned self]と記述して、クラスメンバーをselfで参照できるようにしています。[unowned self]はメモリリーク防止のために記述しています。

選択された値は、row.valueで取得することができます。

実行例

以下に実行例を示します。

[Tips]コードスニペットを作成するには?

はじめに

よく使用するコードをなんども入力するのは面倒ですね。

そこで、よく使用するコードはライブラリとして登録して使い回せるようにします。これをコードスニペットと呼びます。

今回は、コードスニペットを作成する方法を説明します。

環境

Xcode:9.4.1
Swift:4.1.2

コードスニペットの登録方法

以下のようなコメントがあるとします。これを毎回入力するのもコピペして使いまわすのも大変です。

///==================================================
/// 機能:
/// 引数:
///     引数1:
///     引数2:
/// 戻り値:
///
/// Create Date:
/// Update Date:
///==================================================

そこで、コードスニペットとして登録します。

はじめにXcode上でコードスニペットにしたいコードを入力します。

次に、入力したコードを選択して、コードスニペットライブラリにドラッグ&ドロップします。

以下のように詳細情報を入力する画面が表示されるので必要に応じて編集します。

  • Title:登録するコードスニペットのタイトルを入力
  • Summary:コードスニペットの説明を入力
  • Platform:iOSやmacOSなど、コードスニペットを使用するターゲットを選択します。
  • Language:対象の言語を選択します。Swiftが対象の場合は「Swift」を選択。
  • Completion Shortcut:コードスニペットを入力するときのショートカット文字列を入力します。Xcode上でこの文字を入力すると、ここで登録したコードスニペットが入力されます。
  • Completion Scopes:ここで設定したスコープ内で入力補完されます。+を押すことで、複数指定が可能です。

プレースホルダも作成することができます。プレースホルダは、登録したコードスニペット内でTabキーを押して移動できる文字列です。コードスニペットのコードを入力したあとに、変更したい場所がある場合はプレースホルダにしておきます。

プレースホルダを作成するにはコードスニペット内で <# 文字列 #> と入力します。

Completion Scopes

Completion Scopesについて、もう少し詳しく説明します。

Completion Scopesは実際には以下の種類があります。

Completion Scopes 説明
ALL 全てのスコープで使用可能
String or Comment 文字列リテラルとコメント内で使用可能
Top Level importよりも下のレベルで@interface, @implementationより外のスコープ