SwiftUI ObservableObjectの使い方

Pocket

ObservableObjectとは

ObservableObjectは、Combineフレームワーク内の一部の機能オブジェクトです。このオブジェクトを継承元クラスにして使用すると、SwiftUIで監視するすべてのプロパティに@Publishedをマークする必要がありますが、部品にBindingしているプロパティの変更した値が部品に反映できます。

下記コードはObservableObjectを継承したシンプルなクラスです。

class TObserver: ObservableObject {
    @Published var name: String
    init(_ s1: String) {
        self.name = s1
    }
}

nameという文字列を配置していて、@Publishedにしています。下記は、作成したTObserverViewで利用するコードです。

struct ContentView: View {
    @ObservedObject var obj1 = TObserver("初期値")
    var body: some View {
        VStack{
            TextField("Edit1", text: $obj1.name)
            Button("Button1", action: {
                self.obj1.name = "ボタンクリック後"
            })
        }
    }
}

View内でTObserverを作成していますが@ObservedObjectにしています。TextField(“Edit1”, text: $obj1.name)でTObserverのnameとBindingしています。ボタンがクリックされるとnameの文字列を変更し、TextFieldBindingしているので同時に変更します。TObserver@Stateにするとエラーは出ませんがTextFieldの値は変更しません。

@ObservedObjectが使えるのは、ObservableObject継承しているときのみです。従って、このTObserverクラスのObservableObjectを消した場合下記のエラーがでます。

Generic struct 'ObservedObject' requires that 'TObserver' conform to 'ObservableObject'

実行し、ボタンをクリックすると下記のような画面が表示されます。

macOSアプリとして実行した場合の画面

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA