MklocalSearchCompleter никогда не возвращает предложения в Swiftui TextfieldIOS

Программируем под IOS
Ответить
Anonymous
 MklocalSearchCompleter никогда не возвращает предложения в Swiftui Textfield

Сообщение Anonymous »

Я строю форму Swiftui, которая должна автозаполнить адреса улиц так же, как Apple Maps. Я воспроизвел проблему в совершенно новом проекте только с кодом ниже. (Проверено с помощью печати).
• opperter (: didupdateresults :) и opper (< /em>: didfailwitherror :) никогда не вызываются.
• Нет предложений. /> < /blockquote>
import SwiftUI
import MapKit

final class AddressSearchVM: NSObject, ObservableObject, MKLocalSearchCompleterDelegate {

@Published var query = "" {
didSet {
// Update the search fragment whenever the user types
if query.trimmingCharacters(in: .whitespacesAndNewlines).isEmpty {
completer.queryFragment = ""
results = []
} else {
completer.queryFragment = query
}
print("Query changed to: \(query)")
}
}
@Published var results: [MKLocalSearchCompletion] = []

private let completer = MKLocalSearchCompleter()

override init() {
super.init()
completer.delegate = self
completer.resultTypes = [.address]
completer.pointOfInterestFilter = .excludingAll

// Broad region covering the continental US
completer.region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 39.8283, longitude: -98.5795),
span: MKCoordinateSpan(latitudeDelta: 50.0, longitudeDelta: 60.0)
)
}

// MARK: -- MKLocalSearchCompleterDelegate

func completer(_ completer: MKLocalSearchCompleter,
didUpdateResults results: [MKLocalSearchCompletion]) {
print("Received results: \(results.map { $0.title })")
DispatchQueue.main.async {
self.results = Array(results.prefix(5))
}
}

func completer(_ completer: MKLocalSearchCompleter,
didFailWithError error: Error) {
print("Autocomplete error: \(error.localizedDescription)")
DispatchQueue.main.async {
self.results = []
}
}

// MARK: -- Helpers

func clearResults() {
results = []
query = ""
}
}
< /code>

contentview.swift (соответствующая часть) < /p>
< /blockquote>
struct ContentView: View {
@StateObject private var addressVM = AddressSearchVM()
@FocusState private var focus: Field?
@State private var showingSuggestions = false
@State private var pickupAddress = ""

enum Field { case address }

var body: some View {
Form {
Section("Pickup Address") {
HStack {
Image(systemName: "mappin.and.ellipse")
.foregroundColor(.secondary)

TextField("123 Example St", text: $addressVM.query)
.focused($focus, equals: .address)
.onChange(of: addressVM.query) { _, newValue in
showingSuggestions = !newValue.isEmpty && focus == .address
if newValue.isEmpty { pickupAddress = "" }
}
.onChange(of: focus) { _, newFocus in
showingSuggestions = newFocus == .address && !addressVM.query.isEmpty
}
}

if showingSuggestions && !addressVM.results.isEmpty {
VStack(alignment: .leading, spacing: 0) {
ForEach(addressVM.results, id: \.self) { item in
Button {
let full = item.title + (item.subtitle.isEmpty ? "" : ", \(item.subtitle)")
pickupAddress = full
addressVM.query = full
showingSuggestions = false
focus = nil
} label: {
VStack(alignment: .leading, spacing: 2) {
Text(item.title)
if !item.subtitle.isEmpty {
Text(item.subtitle).font(.caption).foregroundColor(.secondary)
}
}
.padding(.vertical, 8)
.frame(maxWidth: .infinity, alignment: .leading)
}
.buttonStyle(.plain)

if item != addressVM.results.last { Divider() }
}
}
}
}
}
}
}
< /code>
Вещи, которые я попробовал < /p>

1.new blank Project только с этим кодом → одно и то же поведение. /> Добавлены явные вызовы в StartupDatingLocation () через CllocationManager, чтобы убедиться, что службы местоположения были активны → все еще без обратных вызовов.>

Подробнее здесь: https://stackoverflow.com/questions/797 ... -textfield
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»