swift - 无法将 View 取出并使其工作 - Swift

标签 swift swiftui

我正在尝试按照教程进行操作,但在单击按钮后,我遇到了操作问题。为了调试,我清理了代码中除了操作本身之外的所有内容,但它仍然不起作用......你能帮忙吗?这可能很简单:

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/

相关文章:

ios - iOS 上的 MobileVLCKit 问题(夜间构建)

ios - 选项卡式应用程序和导航栏(带有标题和图标)

ios - Swift Array .append() 方法在 SwiftUI 中不起作用

ios - 相机预览上的 SwiftUI 位置叠加

swift - 为什么我不能返回一个从声明为 "-> () -> some View"的 Swift 函数返回 View 的闭包?

SwiftUI OnDrop 函数取决于条件

swift - 添加git子模块时报错 "not a git repository"? swift 5.0 Xcode

swift - 如何使用 MMPlayerView 在 Collection View 单元格位于屏幕外时停止视频

xcode - 如何用swift中的开关按钮停止背景音乐?

ios - 使 NavigationView 可搜索,但仅限 TabView 中的一页