SwiftUI - 视图之间的非自愿导航

时间:2021-05-19 06:00:51

标签: swift xcode core-data swiftui

我有两种看法:

父视图首先解码捆绑的 JSON 文件,然后将对象传递给子视图。然后子视图将对象(加上几个额外的对象)保存到 Core Data。

那部分工作正常。问题是,在保存到 Core Data 之后,子视图会导航回父视图,我不知道为什么。预期行为是导航回根视图。

父视图:

struct SelectCityView: View {
    
    @State private var cities = [Destination]()
    @State private var searchText: String = ""
    
    var body: some View {
        
        VStack {
            
            SearchBar(text: $searchText)
            
            List {
                
                // Filter decoded array by search text
                ForEach(cities.filter{self.searchFor($0.city)}.sorted(by: { $0.city < $1.city })) { destination in
                    
                    // Here's where the parent view passes the object to the child view
                    NavigationLink(destination: SelectTravelDatesView(selectedCity: destination)) {
                        Text("\(destination.city), \(destination.country)")
                    }
                }
            }.id(UUID())
            
        }.navigationTitle("Select city")
        .onAppear(perform: {
            
            // Decode JSON data from bundle
            cities = Bundle.main.decode([Destination].self, from: "cities.json")
        })
    }
    
    private func searchFor(_ searchQuery: String) -> Bool {
        return (searchQuery.lowercased(with: .current).hasPrefix(searchText.lowercased(with: .current)) || searchText.isEmpty)
    }
}

子视图:

struct SelectTravelDatesView: View {
    
    @Environment(\.managedObjectContext) private var viewContext
    
    @State var selectedCity: Destination?
    @State private var startDate = Date()
    @State private var endDate = Date()
    
    var body: some View {
        
        Form {
            Section(header: Text("Trip start date")) {
                
                DatePicker(selection: $startDate, in: Date()..., displayedComponents: .date) {
                    Text("Trip start date")
                }.datePickerStyle(GraphicalDatePickerStyle())
            }

            Section(header: Text("Trip end date")) {
                
                DatePicker(selection: $endDate, in: startDate..., displayedComponents: .date) {
                    Text("Trip start date")
                }.datePickerStyle(GraphicalDatePickerStyle())
            }
        }.navigationTitle("Select dates")
        
        .toolbar {
            ToolbarItem(placement: .navigationBarTrailing) {
                
                // Save to Core Data
                Button(action: {
                    addItem()
                }, label: {
                    Text("Save")
                })
            }
        }
    }
    
    private func addItem() {
        withAnimation {
            
            let newItem = Trip(context: viewContext)
            
            if let destination = selectedCity {
                
                newItem.timestamp = Date()
                newItem.destination = destination.city
                newItem.startDate = startDate
                newItem.endDate = endDate
                
                do {
                    try viewContext.save()
                } catch {
                    let nsError = error as NSError
                    fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
                }
            }
        }
    }
}

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

要返回根视图,您可以尝试将“.isDetailLink(false)”添加到 NavigationLink。

SwiftUI: How to pop to Root view