0

いくつかのロジックを挿入したいプロパティ ラッパーを作成しました。「設定」値は正しく動作していますが、テキスト フィールドはすべて大文字のテキストで更新されません。テキスト フィールドにすべて大文字のテキストを表示するべきではありませんか、それともこれがどのように機能するかを誤解していますか?

また、これは不自然な例です。私の最終目標は、プロパティ ラッパーにさらに多くのロジックを挿入することです。大文字の例を使用して機能させるだけです。インターネット全体を検索しましたが、有効な解決策が見つかりませんでした。

import SwiftUI
import Combine

struct ContentView: View {
    @StateObject var vm = FormDataViewModel()

    var body: some View {
        Form {
            TextField("Name", text: $vm.name)
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

class FormDataViewModel: ObservableObject {
    @Capitalized var name: String = ""
}

@propertyWrapper
public class Capitalized {
    @Published var value: String

    public var wrappedValue: String {
        get { value }
        set { value = newValue.uppercased() } //Printing this shows all caps
    }

    public var projectedValue: AnyPublisher<String, Never> {
        return $value
            .eraseToAnyPublisher()
    }

    public init(wrappedValue: String) {
        value = wrappedValue
    }
}
4

2 に答える 2

1

SwiftUI は、またはの@Publishedプロパティを監視し、それらの変更時に UI の更新をトリガーします。@StateObject@ObservedObject

しかし、奥までは入りませんObservableObject。プロパティがありませFormDataViewModelん。@Published


できることの 1 つ@Publishedは、値が変化したときにどうなるかをシミュレートすることです。

class FormDataViewModel: ObservableObject {
    @Capitalized var name: String = ""
    private var nameObserver: AnyCancellable?

    init() {
        nameObserver = _name.$value.sink {_ in
            self.objectWillChange.send()
        }
    }
}

してみてください。

于 2020-08-18T01:00:00.893 に答える
1

@Publishedこれは、よりシンプルで信頼性の高い標準で実行できます。

これが解決策です。Xcode 12 / iOS 14 でテスト済み。

class FormDataViewModel: ObservableObject {
    @Published var name: String = "" {
        didSet {
            let capitalized = name.uppercased()
            if name != capitalized {
                name = capitalized
                objectWillChange.send()
            }
        }
    }
}
于 2020-08-18T03:55:36.673 に答える