我又犯了一个可能又愚蠢的错误。目前的问题是这样的。我正在使用 Apple 的 MKLocalSearchCompleter 获取餐厅的名称和地址。我还使用 SwiftData 存储所有内容。我在表单上显示了一个表单。在调用表单之前,varsity 显示正确的占位符文本。在这种情况下,“tacos”表示餐厅名称,“bell”表示地址。单击位置按钮后,您可以搜索并点击您想要的那个。点击按钮正在更新 review.resataurantName 和 review.location,因为我已将它们打印到控制台。但是它不会更新表单中的值。以下是我认为与该问题相关的代码。
以下是编辑餐食视图
import SwiftUI
import PhotosUI
import SwiftData
struct EditMealView: View {
@Binding var isPresentingNewMealView: Bool
@Environment(\.modelContext) private var modelContext
@State var mealImage: Image? = nil
@State private var selectedItem: PhotosPickerItem? = nil
@Bindable var review: Review
@State private var imageData: Data?
@State var selection: TextSelection? = nil
@State private var locationService = LocationService(completer: .init())
@State private var search: String = ""
@State private var isPresentingLocationView = false
// @State var chosenLocation: String? = AddressView($locationSubtitle)
let foodTypeList: [String] = ["Select One...", "Fast Food", "Vegetarian", "Central African", "East African", "North African", "Southern Africa", "West African", "Latin American", "Native American", "Canadian", "Carribean", "Mexican", "American", "Southern American", "Fusion", "Central American", "South American", "Chinese", "Japanese", "Korean", "Indian", "Middle Eastern", "Thai", "Turkish", "Vietnamese", "Italian", "French", "German", "Spanish", "Greek", "Romanian", "Russian", "Eastern European", "Scandinavian", "British", "Dutch", "Swedish", "Norwegian", "Icelandic", "Irish", "Polynesian", "Australian", "New Zealand", "Other"]
var body: some View {
NavigationStack {
ZStack {
LinearGradient(gradient: Gradient(colors: [Color(red: 0.9725490196078431, green: 0.9607843137254902, blue: 0.8627450980392157, opacity: 1), Color(red: 0.9137254901960784, green: 0.9254901960784314, blue: 0.8509803921568627, opacity: 1), Color(red: 0.9882352941176471, green: 0.7529411764705882, blue: 0.13333333333333333, opacity: 1), Color(red: 0.9450980392156862, green: 0.47058823529411764, blue: 0.08627450980392157, opacity: 1)]), startPoint: .top, endPoint: .bottom).ignoresSafeArea()
.navigationTitle("Add Meal")
VStack{
Form {
TextField("Menu Item", text: $review.foodName)
.listRowBackground(Color.clear)
.autocorrectionDisabled()
HStack {
Button(action: {isPresentingLocationView = true}
) {
Text("Location")
Image(systemName: "map")
}
.sheet(isPresented: $isPresentingLocationView) {
AddressView(isPresentingLocationView: $isPresentingLocationView, review: Review(foodName: "", restaurantName: "", location: "muncie", rating: 3, foodImage: nil, foodType: "", reviewNotes: "")//, //restaurantName: ""
)
}
VStack {
Text("\(review.restaurantName)")
.listRowBackground(Color.clear)
.autocorrectionDisabled()
Text("\(review.location)")
.listRowBackground(Color.clear)
.autocorrectionDisabled()
}
}
.listRowBackground(Color.clear)
Picker(selection: $review.foodType, label: Text("\(review.foodType)")) {
ForEach(0..<foodTypeList.count, id: \.self) {
Text(self.foodTypeList[$0])
.tag(self.foodTypeList[$0])
}
}
.listRowBackground(Color.clear)
HStack{
Spacer()
RatingView(rating: $review.rating)
.multilineTextAlignment(TextAlignment.center)
Spacer()
}
.buttonStyle(.plain)
.listRowBackground(Color.clear)
if let imageData = review.foodImage, let uiImage = UIImage(data: imageData) {
Image(uiImage: uiImage)
.resizable()
.scaledToFit()
}
PhotosPicker(selection: $selectedItem, matching: .images) {
Label("Select a photo", systemImage: "fork.knife")
}
.onChange(of: selectedItem, loadPhoto)
.listRowBackground(Color.clear)
.padding()
}
.listRowBackground(Color.clear)
.padding()
Spacer()
HStack {
Text("Notes")
.padding()
.font(.headline)
Spacer()
}
TextEditor(text: $review.reviewNotes, selection: $selection)
.background(Color.white.opacity(0.40))
}
.scrollDismissesKeyboard(.immediately)
}
.scrollContentBackground(.hidden)
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Dismiss") {
isPresentingNewMealView = false
}
}
ToolbarItem(placement: .confirmationAction) {
Button("Add") {
let newReview = review
modelContext.insert(newReview)
isPresentingNewMealView = false
}
}
}
}
}
func loadPhoto() {
Task { @MainActor in
review.foodImage = try await selectedItem?.loadTransferable(type: Data.self)
}
}
}
地址视图
import SwiftUI
import MapKit
import SwiftData
struct AddressView: View {
@State private var locationService = LocationService(completer: .init())
@State private var search: String = ""
@Binding var isPresentingLocationView: Bool
@Bindable var review: Review
var body: some View {
NavigationStack {
ZStack {
LinearGradient(gradient: Gradient(colors: [Color(red: 0.9725490196078431, green: 0.9607843137254902, blue: 0.8627450980392157, opacity: 1), Color(red: 0.9137254901960784, green: 0.9254901960784314, blue: 0.8509803921568627, opacity: 1), Color(red: 0.9882352941176471, green: 0.7529411764705882, blue: 0.13333333333333333, opacity: 1), Color(red: 0.9450980392156862, green: 0.47058823529411764, blue: 0.08627450980392157, opacity: 1)]), startPoint: .top, endPoint: .bottom).ignoresSafeArea()
.navigationTitle("Add Location")
VStack {
HStack {
Image(systemName: "magnifyingglass")
TextField("Search for a restaurant", text: $search)
.autocorrectionDisabled()
}
Spacer()
List {
ForEach(locationService.completions) { completion in
Button(action: {didTapOnCompletion(completion)}) {
VStack(alignment: .leading, spacing: 4) {
Text(completion.title)
.font(.headline)
.fontDesign(.rounded)
Text(completion.subTitle)
}
}
.listRowBackground(Color.clear)
}
}
.listStyle(.plain)
.scrollContentBackground(.hidden)
}
.onChange(of: search) {
locationService.update(queryFragment: search)
}
.padding()
.presentationBackground(.regularMaterial)
.presentationBackgroundInteraction(.enabled(upThrough: .large))
}
}
}
private func didTapOnCompletion(_ completion: SearchCompletions) {
isPresentingLocationView = false
review.restaurantName = completion.title
review.location = completion.subTitle
print("this is the name \(review.restaurantName) and this is the location \(review.location)")
}
}