SwiftUI:可选类型的值';装订<;字符串>';必须展开为类型为';装订<;字符串>';
我目前正在学习SwiftUI并试图理解SwiftUI:可选类型的值';装订<;字符串>';必须展开为类型为';装订<;字符串>';,swift,swiftui,textfield,Swift,Swiftui,Textfield,我目前正在学习SwiftUI并试图理解@EnvironmentObject,我发现这有点让人困惑 我想在我的应用程序中共享一个包含一些数据的商店,所以我写了以下内容: class Store: ObservableObject { @Published var user: User? } class User: ObservableObject { @Published var name: String? } 我的应用程序视图: struc
@EnvironmentObject
,我发现这有点让人困惑
我想在我的应用程序中共享一个包含一些数据的商店,所以我写了以下内容:
class Store: ObservableObject {
@Published var user: User?
}
class User: ObservableObject {
@Published var name: String?
}
我的应用程序视图:
struct AppView: View {
@EnvironmentObject var store: Store
var body: some View {
ContentView()
.environmentObject(store)
}
}
}
情景公使:
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
var store = Store()
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
let appView = AppView().environmentObject(store)
window.rootViewController = UIHostingController(rootView: appView)
self.window = window
window.makeKeyAndVisible()
}
}
}
在ContentView
中:
struct ContentView: View {
@EnvironmentObject var store: Store
var body: some View {
VStack {
TextField("Type some text here", text: $store.user?.name ?? "")
}
}
}
但是,我在声明文本字段的行中遇到错误:
必须将可选类型为“Binding”的值展开为类型为“Binding”的值
我不明白这意味着什么,也不知道该怎么办
感谢您的帮助如果user
和name
变量都可以是nil
,那么这里有一个可能的解决方案-您需要使用自定义绑定:
struct ContentView: View {
@EnvironmentObject var store: Store
var binding: Binding<String> {
.init(get: {
store.user?.name ?? ""
}, set: {
store.user?.name = $0
})
}
var body: some View {
VStack {
TextField("Type some text here", text: binding)
}
}
}
而TextField
将正常工作:
TextField("Type some text here", text: $store.user.name)
如果用户
为零,该怎么办?在存储
中,如果要消除错误,请选择用户
(添加?
),或者使用强制将其展开代码>。如果强制展开,则必须在加载视图之前检查nil
,否则如果有user=nil
@pawello2222,则会发生崩溃。谢谢您的回答。如果user为nil,我尝试设置默认值(请参见编辑),但仍然存在相同的错误。但是“”不是变量,而是常量。您需要了解,您为text:
提供的内容是一个变量,TextField可用于将用户输入的文本绑定到该变量。我认为您需要返回并找出一种方法,使user
在您的商店类型中成为非可选的。
TextField("Type some text here", text: $store.user.name)