Eu de novo com o que provavelmente é outro erro estúpido. O problema no momento é este. Estou usando o MKLocalSearchCompleter da Apple para obter o nome e o endereço de um restaurante. Também estou usando o SwiftData para armazenar tudo. Tenho uma planilha sendo apresentada sobre o formulário. Antes de chamar a planilha, a universidade mostra o texto correto do espaço reservado. Neste caso, "tacos" para o nome do restaurante e "bell" para o endereço. Depois de clicar no botão de localização, você pode pesquisar e tocar naquele que deseja. O toque está atualizando o review.resataurantName e o review.location porque eu os imprimi no console. No entanto, ele não atualizará os valores no formulário. Aqui está meu código que acho relevante para o problema.
Aqui está a visualização da refeição editada
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)
}
}
}
a vista do endereço
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)")
}
}
Não consigo entender o que está acontecendo. Aqui está um pequeno gif também.