SwiftUI ObservableObjectのobjectWillChange

Pocket

前回、ObservableObjectを継承したクラスを使用したコードを紹介しました。そのクラスを使用しobjectWillChangeイベントを試してみます。

class TObserver:ObservableObject  {
    @Published var num: Int
    init(_ i1: Int) {
        self.num = i1
    }
}

前回と同じく ObservableObjectを継承したTObserverという名称のクラスを作成しました。
クラス内にはnumという数値型の変数を用意しています。

View側で@ObservedObjectを指定した TObserverを用意し VStackのonAppear時にobjectWillChangeイベントを設定します。

onAppearはビューが表示されるときに実行されます。

下記は実装したコードです。

struct ContentView: View {
    @ObservedObject var obj1 = TObserver(100)
    @State var func1: Any?
    var body: some View {
        VStack{
            Button("Button1", action: {
                self.obj1.num = 200
            })
        }.onAppear(perform: {
            self.func1 = self.obj1.objectWillChange.sink(receiveValue: self.changeAction1)
        })
    }
    
    func changeAction1(){
        print("Change before = " + String(obj1.num))
        print("「obj1」の内容変更を知らせる")
    }
}

onAppear内の処理は、@Stateで指定したfunc1: AnyにobjectWillChange.sink()を代入しています。これは、obj1TObserver」の内容変更があった場合にchangeAction1を実行するように指定しています。func1を用意しない場合changeAction1は実行されませんでした。“Button1”のactionには、obj1.num200を入れて変更させています。この“Button1″をクリックするとchangeAction1が実行されるようになります。obj1の変更される前の状態がobjectWillChangeに入ります。

コメントを残す

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

CAPTCHA