1

画像にフィルターを適用するアプリに取り組んでいます。フィルターには、ユーザーが変更できる多くのパラメーターがあります。上記のパラメーターを含む ObservableObject を作成しました。パラメータの 1 つが変更されるたびに、ビューが以前と同じ値を表示する場合でも、ビューの目に見える更新があります。これは、パラメーターを個々の @State 変数としてモデル化した場合には発生しません。

これが予想される場合 (すべての観察対象オブジェクト変更されるため、それに依存する各ビューが更新されます)、ObservedObject はジョブに適したツールですか? 一方、特に多数のパラメーター (たとえば 10 以上) を複数のサブビューに渡す必要がある場合は、パラメーターを個別の @State/@Binding 変数としてモデル化するのは非常に不便です。

したがって、私の質問:

ここで ObservedObject を正しく使用していますか? 目に見える更新は意図したものではありませんが、受け入れられますか?それとも、swiftUI でこれを処理するためのより良い解決策はありますか?

@ObservedObject を使用した例:

import SwiftUI

class Parameters: ObservableObject {
    @Published var pill: String = "red"
    @Published var hand: String = "left"
}

struct ContentView: View {

    @ObservedObject var parameters = Parameters()

    var body: some View {
        VStack {

            // Using the other Picker causes a visual effect here...
            Picker(selection: self.$parameters.pill, label: Text("Which pill?")) {

                Text("red").tag("red")
                Text("blue").tag("blue")

            }.pickerStyle(SegmentedPickerStyle())

            // Using the other Picker causes a visual effect here...
            Picker(selection: self.$parameters.hand, label: Text("Which hand?")) {

                Text("left").tag("left")
                Text("right").tag("right")

            }.pickerStyle(SegmentedPickerStyle())
        }
    }
}

@State 変数を使用した例:

import SwiftUI

struct ContentView: View {

    @State var pill: String = "red"
    @State var hand: String = "left"

    var body: some View {
        VStack {

            Picker(selection: self.$pill, label: Text("Which pill?")) {

                Text("red").tag("red")
                Text("blue").tag("blue")

            }.pickerStyle(SegmentedPickerStyle())

            Picker(selection: self.$hand, label: Text("Which hand?")) {

                Text("left").tag("left")
                Text("right").tag("right")

            }.pickerStyle(SegmentedPickerStyle())
        }
    }
}
4

2 に答える 2