# SwiftUIメモ. 自前のViewを定義する

# 最低限のもの

# 定義

struct Hello: View {
    var body: some View {
        Text("Hello")
    }
}

# 呼び出し

struct ContentView: View {
    var body: some View {
        HStack {
            Hello()
        }
    }
}

# オブジェクトを渡す

# 定義

struct RowView: View {
    var photo: PhotoData // ← これでコンストラクタの引数で渡せるようになるようだ
    ...
}

PhotoData に当たる部分は Identifiable プロトコルで作る必要あり

struct PhotoData: Identifiable {
    var id: Int // ← これがプロトコルで必須のもの
    var imageName: String
    var title: String
}

id は特に使わないなら UUID() を指定すれば良い?

TODO: structとclassの使い分けは調べておく

# 呼び出し

struct ContentView: View {
    var body: some View {
        List(photoArray) { item in
            RowView(photo: item) // ← ここ
        }
    }
}

# プレビューを定義する

# 定義

struct RowView_Previews: PreviewProvider { // 名前付けをこうするルールなのだろうか
    static var previews: some View {
        RowView(photo: photoArray[0])
            // 通常は photoArray の部分は動的に取るのだろうから、
            // サンプルデータを別で定義する感じだろうな
        .previewLayout(.fixed(width: 300, height: 80))

        // iPhone にする場合
        .previewDevice("iPhone 8")
    }
}
  • 複数出したい場合は Group { .. } で囲う

たとえば EventKit からデータ取る部分が、これ使えないので、ここに出す用に

  • @State のメンバには親クラスを、
  • Preview 用には子クラス1(スタブ)を
  • メインの方には子クラス2(呼び出し元から呼ばれるEventKit入り)

・・という感じで分けてみた。

使い方として合っているかは不明だが、それっぽく動作している。

# 呼び出し

プレビュー画面を見るだけ

# 変更可能なメンバを定義 (@State, Data Binding)

# 定義

struct ContentView: View {
    @State var num: Int = 0
    ...
}

[ 📩 ご意見 ]