我有两种看法:
父视图首先解码捆绑的 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)")
}
}
}
}
}
任何帮助将不胜感激。
答案 0 :(得分:0)