Мои опубликованные переменные в моей модели представления сбрасываются до значений по умолчанию, когда я запускаю код
У меня были проблемы с обновлением опубликованной переменной в моей модели, поэтому я попытался воспроизвести проблему с очень простым и простым набором файлов/кодов. Таким образом, в основном есть навигационная ссылка, при нажатии на которую обновляется опубликованная переменная вListRepository model
присвоив ему строковое значение «да», выводит его на консоль, а затем переходит к месту назначения, которое называетсяContentView view
. Проблема вContentView
, я попытался распечатать данные, содержащиеся в опубликованной переменной с именемselectedFolderId
надеясь, что он напечатает «да», но я заметил, что вместо того, чтобы печатать значение, которое было установлено в , вместо этого было напечатано значение по умолчанию""
, что было не то, что было установлено в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 ответ
Это распространенная проблема, когда вы впервые имеете дело с потоком данных в приложении. Проблема проста. В представлении «NavLink» вы создаете одну версию , а в представлении вы создаете отдельную и другую версию . Что вам нужно сделать, это передать созданный вNavLink
вContentView
когда вы его называете. Вот один пример того, как:
struct NavLink: View {
@StateObject var listRepository = ListRepository() // Create as StateObject, not ObservedObject
var body: some View {
NavigationView{
ScrollView {
NavigationLink("Hello world", destination: ContentView(listRepository: listRepository)) // Pass it here
Text("Player 1")
Text("Player 2")
Text("Player 3")
}
.simultaneousGesture(TapGesture().onEnded{
listRepository.selectedFolderId = "yes"
listRepository.md()
})
.navigationTitle("Players")
}
}
}
struct ContentView: View {
@ObservedObject var listRepository: ListRepository // Do not create it here, just receive it
var body: some View {
VStack{
Text("content 1")
Text("content 2")
Text("content 3")
}
.onAppear{
print("========")
print(listRepository.selectedFolderId)
print("========")
}
}
}
Вы также должны заметить, что я создалListRepository
как . Представление, которое изначально создаетObservableObject
должен создать его какStateObject
или вы можете получить нежелательные побочные эффекты.