SwiftUI可观测对象不';第一次尝试时无法更新UI 问题
SwiftUI可观测对象不';第一次尝试时无法更新UI 问题,swiftui,observableobject,Swiftui,Observableobject,@observeObjectViewModel仅在关闭并重新打开视图后更新UI。一旦发生此更新,@observeObject中@Published变量中的每个后续更改都会触发自动更新 上下文 我的项目中有一个名为“堆栈”的模型 struct Stack: Identifiable, Equatable { var id = UUID() var title: String var isPinned = false } 我有一个视图(NavigationMenuView)
@observeObject
ViewModel仅在关闭并重新打开视图后更新UI。一旦发生此更新,@observeObject
中@Published
变量中的每个后续更改都会触发自动更新
上下文
我的项目中有一个名为“堆栈”的模型
struct Stack: Identifiable, Equatable {
var id = UUID()
var title: String
var isPinned = false
}
我有一个视图(NavigationMenuView),它在滚动视图中显示所有堆栈
导入快捷键
struct NavigationMenuView: View {
@ObservedObject var viewModel = NavigationMenuViewModel()
@EnvironmentObject var environmentObjects: EnvironmentObjects
var body: some View {
ZStack{
NavigationView {
VStack(alignment: .leading){
ScrollView {
ForEach(viewModel.stacks){ stack in
StackRow(
stack: stack,
lftButtonAction: {
self.viewModel.toggleIsPinned(for: stack)
},
rhtButtonAction: {
self.viewModel.deleteStack(stack: stack)
}
)
}
}
}
.navigationBarTitle(Text("Home"))
.navigationBarItems(trailing: addNewStackButton)
.background(Color(UIColor.systemGray6).edgesIgnoringSafeArea(.all))
}.zIndex(1)
if environmentObjects.newStackViewIsShown {
VStack{
Spacer()
NewStackView(viewModel: NewStackViewModel())
}
.onDisappear{
self.viewModel.fetchStacks()
}
.zIndex(2)
}
}
.onAppear{
self.viewModel.fetchStacks()
}
}
}
此视图的视图模型有一个@已发布的var stacks=[Stack]()
数组,该数组通过fetchStacks()
获取更新
NavigationMenuView有一个子视图(NewStackView),它使用以下按钮创建一个新的“堆栈”(使用ViewModel):
Button(action: {
if !self.isAddButtonDisabled{
self.viewModel.addNewStack(title: self.title)
self.environmentObjects.newStackViewIsShown = false
}
}) {
Text("Add")
.padding(.vertical, 16.0)
.frame(minWidth: 0, maxWidth: .infinity)
.foregroundColor(Color(UIColor.systemBackground))
.background(
RoundedRectangle(cornerRadius: 10, style: .continuous)
.foregroundColor(addButtonColor)
)
}
.disabled(isAddButtonDisabled)
我自己的进步
我发现只有当NewStackView
显示为NavigationMenuView的子视图时,才会出现这种情况。当使用.sheet()
将其显示为模式视图时,NewStackView会立即更新