Open5

【SwiftUI】UIKitを使う際の知識

104104

SwiftUIとUIKitのViewの構築方法の違い

  • SwiftUIのViewは構造体なのに対して、UIKitのViewはクラスで生成されているという違いがある。
  • SwiftUIのViewは宣言型で記述するのに対して、UIKitのViewは手続き型で記述するという違いがある。
    • SwiftUIでは外観の構築に焦点を当てている。状態の変更などによって自動的にViewは更新される。
    • UIKitではプロパティの値が変更された場合には手動で更新する必要がある。
  • UIKitではdelegateという概念があるが、SwiftUIにはdelegateがない。
104104

ViewControllerとは

  • その名の通りViewの動作を管理するオブジェクト。
    • Viewの階層の管理
    • ユーザーが入力したイベントの処理
    • データオブジェクトとViewの仲介。
    • Viewが作成するリソースの管理
  • UIKitの組み込みクラスであるUIViewControllerのサブクラスとして作成する。

View Controller Programming Guide for iOS: The Role of View Controllers

104104

UIView

UIKit上でViewを構築する基底クラスである。
全てのViewはUIViewクラスを継承しており、例えば下記のようなものが組み込みで存在する。

  • UILabel
  • UIButton
  • UITableView
  • UITextField
  • UISearchBar
104104

UIViewRepresentableの使い方

SwiftUIでUIKitのViewを使うためのプロトコル

makeUIViewとupdateUIViewの2つのViewの実装が必要になる。

makeUIView

func makeUIView(context: Self.Context) -> Self.UIViewType

makeUIViewメソッドの構文は上記のようになっており、引数のcontextにはSelf.Context、戻り値の型はSelf.UIViewTypeが指定されている。

Selfとあることから引数はUIRepresentableを継承したクラスのContextであり、戻り値は最終的にSwiftUI上に表示したいUIKitのViewの型を指定することになる。

struct CustomView: UIViewRepresentable {
    typealias Context = UIViewRepresentableContext<Self>

    func makeUIView(context: Context) -> UIView {
     // UIViewを返す処理
    }

updateUIView

func updateUIView(
    _ uiView: Self.UIViewType,
    context: Self.Context
)

こちらはUIViewの状態をSwiftUIのViewライフサイクルに則って更新するメソッド。
引数自体はmakeUIViewのものと変わらない。

makeUIViewはあくまで最初にUIViewのインスタンスを作成するのに使用し、更新する際はupdateUIViewメソッドを使用する。

104104

Coordinatorクラス

  • UIKitのUIViewクラスには通常、ユーザーからの入力を処理できるdelegateが存在する。
  • delegateなどのUIKitが持つ働きをSwiftUI上でも実行するために、Coordinatorというオブジェクトを使った仕組みが存在する。CoorinatorがSwiftUIViewとUIKitViewの橋渡しを行う。
  • makeCoordinatorメソッドはmakeUIViewクラスより先に実行される。
  • makeCoordinatorでCoodinatorクラスのインスタンスを生成する。
  • UIViewのdelegateにcoordinator(context.coodinator)を渡す。

UIViewRepresentableのCoordinatorはなぜ必要か
Using UIKit views in SwiftUI