我正在尝试按照教程进行操作,但在单击按钮后,我遇到了操作问题。为了调试,我清理了代码中除了操作本身之外的所有内容,但它仍然不起作用......你能帮忙吗?这可能很简单:
import Foundation
class UserInfo: ObservableObject{
@Published var test = "test"
}
以及 View :
import SwiftUI
import Firebase
struct ContentView: View {
@StateObject var userInfo: UserInfo = UserInfo()
var body: some View {
VStack{
Text(userInfo.test)
Button(action: {
self.userInfo.test = "passed"
}) {
Text("Log in")
}
.font(.title)
.padding(5)
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
.padding(.top, 10)
}
}
}
上面的代码可以正常工作。但是当我尝试创建新 View 时:
struct NewView: View {
@StateObject var userInfo: UserInfo = UserInfo()
var body: some View {
VStack{
Text("test")
Button(action: {
self.userInfo.test = "passed"
}) {
Text("Log in")
}
.font(.title)
.padding(5)
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
.padding(.top, 10)
}
}
}
然后我将其放入内容 View 中:
struct ContentView: View {
@StateObject var userInfo: UserInfo = UserInfo()
var body: some View {
NewView()
}
}
按钮停止工作...我假设这两个 View 都符合 ObservableObject。当它更改时,ContentView 应该更新,但什么也没有发生。
最佳答案
您正在创建两个不相关的UserInfo
对象。当您使用@StateObject时,您是在说您创建并拥有该对象,并且您将该对象提供给其他需要它的事物。
要解决此问题,您应该只在 ContentView
中创建一个 UserInfo
并将其注入(inject)到 NewView
struct NewView: View {
@ObservedObject var userInfo: UserInfo
var body: some View {
VStack{
Text("\(userInfo.test)")
Button(action: {
self.userInfo.test = "passed"
}) {
Text("Log in")
}
}
}
}
struct NewView_Previews: PreviewProvider {
static var previews: some View {
let userInfo: UserInfo = UserInfo()
NewView(userInfo: userInfo)
}
}
和
struct ContentView: View {
@StateObject var userInfo: UserInfo = UserInfo()
var body: some View {
NewView(userInfo: userInfo)
}
}
在这里,您将 UserInfo
下坡给 NewView
。
如果您希望层次结构中的所有内容都可以使用 @EnvironmentObject
访问 UserInfo
可能会更好,但那是另一个主题了。
关于swift - 无法将 View 取出并使其工作 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65409060/