我正在創建一個回傳其編輯器視圖的類。但是遇到了錯誤
無法將“Published.Publisher”型別的值轉換為預期的引數型別“Binding”
這是 Playgrounds 的簡單測驗代碼。
import SwiftUI
import PlaygroundSupport
struct EditorView: View {
@Binding var text: String
var body: some View {
HStack {
Text("Name:")
TextField("Jerry", text: $text)
}
}
}
class MyModel: ObservableObject {
@Published var name: String = "Tom"
func editorView() -> some View {
EditorView(text: $name) // [ERROR] Cannot convert value of type 'Published.Publisher' to expected argument type 'Binding<String>'
}
}
struct ContentView: View {
@StateObject var model: MyModel = .init()
var body: some View {
model.editorView()
}
}
struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
.previewLayout(.fixed(width: 375, height: 400))
}
}
let viewController = UIHostingController(rootView: ContentView())
let nav = UINavigationController(rootViewController: viewController)
PlaygroundPage.current.liveView = nav
怎么了?
2022.03.23 添加
我測驗了沒有系結的視圖,它可以作業。我認為該類可以使用其屬性創建一個視圖。但不能通過@Binding。
import SwiftUI
import PlaygroundSupport
struct EditorView: View {
@Binding var text: String
var body: some View {
HStack {
Text("Name:")
TextField("Jerry", text: $text)
}
}
}
// Just display the name parameter
struct DispView: View {
let name: String
var body: some View {
Text(name)
}
}
class MyModel: ObservableObject {
@Published var name: String = "Tom"
@ViewBuilder
func editorView() -> some View {
// EditorView(text: $name) // Error at this line.
DispView(name: name) // Pass the property.
}
}
struct ContentView: View {
@StateObject var model: MyModel = .init()
var body: some View {
model.editorView()
}
}
struct ContentView_Preview: PreviewProvider {
static var previews: some View {
ContentView()
.previewLayout(.fixed(width: 375, height: 400))
}
}
let viewController = UIHostingController(rootView: ContentView())
let nav = UINavigationController(rootViewController: viewController)
PlaygroundPage.current.liveView = nav
uj5u.com熱心網友回復:
你在錯誤的地方創建了 EditorView,把它放在你的ContentView而不是你的 ViewModel 中。ViewModel 用于保存資料(或模型)而不是 View。我相信 SwiftUI 不是為攜帶視圖而設計的。
struct ContentView: View {
@StateObject var model: MyModel = .init()
var body: some View {
editorView
}
}
extension ContentView {
@ViewBuilder
var editorView: some View {
EditorView(text: $model.name)
}
}
如果你仍然想把它放在你的 ViewModel 中,這應該是作業代碼。您可以為視圖初始化程式創建新的系結作為引數。
@ViewBuilder
func editorView() -> some View {
EditorView(text:
Binding { name } set: { newName in self.name = newName }
)
}
uj5u.com熱心網友回復:
系結由StateObject包裝器(on ObservableObject)提供,并且應該在body(即在視圖層次結構中)創建一個視圖,所以它應該看起來像
struct ContentView: View {
@StateObject var model: MyModel = .init()
var body: some View {
EditorView(text: model.$name) // << here !!
}
}
注意:替代方法是直接EditorView依賴于MyModel,然后在這樣的視圖中,您可以創建一個提供所需系結的包裝器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/447590.html
下一篇:從滿足范圍的條件中洗掉多行
