我在更新模型中发布的变量时遇到了问题,所以我尝试用一组非常基本和简单的文件/代码来复制这个问题。所以基本上在NavLink view
中,有一个导航链接,当点击它时,它会更新ListRepository model
中发布的变量,给它一个字符串值“yes”,打印到控制台,然后导航到它的目的地,称为ContentView view
。问题出在ContentView
中,我试图打印包含在名为selectedFolderId
的已发布变量中的数据,希望它会打印“yes”,但我注意到,它没有打印NavLink view
中设置的值,而是打印""
的默认值,这不是NavLink view
中设置的值。请大家解释一下出现这种行为的原因,并向我解释一下如何解决这个问题,因为我对快速用户界面非常陌生。这将意味着很多。
请在下面找到支持文件:
import SwiftUI
struct NavLink: View {
@StateObject var listRepository = ListRepository()
var body: some View {
NavigationView{
ScrollView {
NavigationLink("Hello world", destination: ContentView(listRepository: listRepository))
Text("Player 1")
Text("Player 2")
Text("Player 3")
}
.simultaneousGesture(TapGesture().onEnded{
listRepository.selectedFolderId = "yes"
listRepository.md()
})
.navigationTitle("Players")
}
}
}
struct NavLink_Previews: PreviewProvider {
static var previews: some View {
NavLink()
}
}
import Foundation
class ListRepository: ObservableObject {
@Published var selectedFolderId = ""
func md(){
print("=====")
print(self.selectedFolderId)
print("======")
}
}
import SwiftUI
struct ContentView: View {
@ObservedObject var taskListVM = ShoppingListItemsViewModel()
@ObservedObject var listRepository:ListRepository
var body: some View {
VStack{
Text("content 1")
Text("content 2")
Text("content 3")
}
.onAppear{
taskListVM.addTask()
print("========")
print(listRepository.selectedFolderId)
print("========")
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
class ShoppingListItemsViewModel: ObservableObject {
@Published var listRepository = ListRepository()
@Published var taskCellViewModels = [ShoppingListItemCellViewModel]()
private var cancellables = Set<AnyCancellable>()
init() {
listRepository.$tasks
.map { lists in
lists.map { list in
ShoppingListItemCellViewModel(task: list)
}
}
.assign(to: \.taskCellViewModels, on: self)
.store(in: &cancellables)
}
func addTask() {
listRepository.addTask(task)
}
}
1条答案
按热度按时间kulphzqa1#
当您第一次处理应用程序中的数据流时,这是一个常见问题。问题很简单。在‘NavLink’视图中,您正在创建
ListRepository
的一个版本,而在ContentView
中,您将创建另一个不同版本的ListRepository
。您需要做的是在调用NavLink
时将在NavLink
中创建的ListRepository
传递给ContentView
。下面是一个如何做到这一点的例子:您还应该注意到,我将
ListRepository
创建为StateObject
。最初创建ObservableObject
的视图必须将其创建为StateObject
,否则可能会产生不良副作用。