可以在视图主体之外访问 FocusState 的值

Kev*_*OUX 8 mvvm viewmodel swiftui

我想将我的 @FocusState 驱逐到我的 viewModel 中:

struct ContentView: View {
    @ObservedObject private var viewModel = ViewModel()
    
    var body: some View {
        Form {
            TextField("Text", text: $viewModel.textField)
                .focused(viewModel.$hasFocus)
            Button("Set Focus") {
                viewModel.hasFocus = true
            }
        }
    }
}

class ViewModel: ObservableObject {
    @Published var textField: String = ""
    @FocusState var hasFocus: Bool
}
Run Code Online (Sandbox Code Playgroud)

但是当我启动我的应用程序时,我收到以下 SwiftUI 警告:

运行时:SwiftUI:在视图主体之外访问 FocusState 的值。这将导致 Binding 的初始值恒定并且不会更新。

在这种情况下,我的绑定永远不会改变。

我的问题是:可以在 viewModel 中使用 FocusState 吗?

Asp*_*eri 12

它是视图中的包装器(与 相同State)。但可以将其映射到已发布的属性,如下面的方法所示。

使用 Xcode 13.2 / iOS 15.2 进行测试

struct ContentView: View {
    @ObservedObject private var viewModel = ViewModel()
    @FocusState var hasFocus: Bool

    var body: some View {
        Form {
            TextField("Text", text: $viewModel.textField)
                .focused($hasFocus)
                .onChange(of: viewModel.hasFocus) {
                    hasFocus = $0
                }
                .onChange(of: hasFocus) {
                    viewModel.hasFocus = $0
                }
            Button("Set Focus") {
                viewModel.hasFocus = true
            }
        }
    }
}

class ViewModel: ObservableObject {
    @Published var textField: String = ""
    @Published var hasFocus: Bool = false
}
Run Code Online (Sandbox Code Playgroud)