Мои опубликованные переменные в моей модели представления сбрасываются до значений по умолчанию, когда я запускаю код

У меня были проблемы с обновлением опубликованной переменной в моей модели, поэтому я попытался воспроизвести проблему с очень простым и простым набором файлов/кодов. Таким образом, в основном есть навигационная ссылка, при нажатии на которую обновляется опубликованная переменная в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или вы можете получить нежелательные побочные эффекты.

Другие вопросы по тегам