swift - 无法查看并使其工作 - 斯威夫特
问题描述
我试图按照教程进行操作,但单击按钮后操作出现问题。为了调试,我清理了除了操作本身之外的所有代码,但它仍然无法正常工作......你能帮忙吗?它可能很简单:
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 应该更新,但没有任何反应。
解决方案
您正在创建两个不相关的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
。
可能如果您希望层次结构中的所有内容都可以访问UserInfo
using@EnvironmentObject
会更好,但这是另一个主题。
推荐阅读
- intellij-idea - 从建议的变体中选择语句后 IntelliJ IDEA 自动插入空间
- python - 在 Sklearn 异常值检测方法中将“污染”参数设置为“自动”有什么作用?
- sql - SQL替换函数错误,同时使用它来替换一个字符串
- php - Mysql更新查询中'(空白)where'和'where'有什么区别
- javascript - 如何将表单或 url 参数传递给模式弹出窗口?
- alloy - 违反合金事实
- java - Java 1.6 和检测 samba 符号链接
- javascript - 如何在不刷新整个页面的情况下重新加载组件?
- sql - SQL Server:在链接服务器上远程启用 xp_cmdshell
- javascript - 如何使用 jquery 在单击时添加引导表单组?