首页 > 解决方案 > 无法查看并使其工作 - 斯威夫特

问题描述

我试图按照教程进行操作,但单击按钮后操作出现问题。为了调试,我清理了除了操作本身之外的所有代码,但它仍然无法正常工作......你能帮忙吗?它可能很简单:

import Foundation

class UserInfo: ObservableObject{
    
    @Published var test = "test"
    
}

和观点:

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)
            }
    }
}

上面的代码可以正常工作。但是当我尝试提出新观点时:

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)
            }
    }
}

而不是我把它放到内容视图中:

struct ContentView: View {
    @StateObject var userInfo: UserInfo = UserInfo()
    var body: some View {
        
    NewView()
    
    }
}

按钮停止工作......我假设这两个视图都符合 ObservableObject。当它改变 ContentView 应该更新,但没有任何反应。

标签: swiftswiftui

解决方案


您正在创建两个不相关的UserInfo对象。当您使用时,@StateObject您是在说您创建并拥有该对象,并且您将该对象提供给需要它的其他事物。

要解决这个问题,你应该只创建一个UserInfo并将ContentView下坡注入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

可能如果您希望层次结构中的所有内容都可以访问UserInfousing@EnvironmentObject会更好,但这是另一个主题。


推荐阅读