SwiftUI - Могу ли я использовать обработчик завершения в действии кнопки? - PullRequest
1 голос
/ 04 августа 2020

У меня есть форма, в которой указывается имя нового пользователя и почтовый индекс. Когда пользователь нажимает «Сохранить», я использую Core Location, чтобы взять почтовый индекс и найти соответствующий город и штат. На этом этапе я хочу, чтобы обработчик завершения сохранил данные формы вместе с городом и штатом. Но по какой-то причине часть завершения не срабатывает. Я все еще пытаюсь выяснить обработчики завершения, но мне показалось, что я довольно близко подошел ... (очевидно, мне нужно иметь дело с обработкой ошибок, и код мог бы быть более кратким .)

Button(action: {
    self.getCityStateFromPostalCode(zip: self.zip, completion: {
        //This isn't getting called
        let newCustomer = Customer(context: self.moc)
        newCustomer.custName = self.name
        newCustomer.custZip = self.zip
        newCustomer.custState = self.state
        newCustomer.custCity = self.city
        self.appDelegate.saveContext()
    })
}) {
    Text("Save")
}

func getCityStateFromPostalCode(zip: String, completion: @escaping () -> ()) {
    let geocoder = CLGeocoder()
    var city = ""
    var state = ""
    
    geocoder.geocodeAddressString(zip) { (placemarks, error) in
        if let placemark = placemarks?[0] {
            if placemark.postalCode == zip {
                city = placemark.locality!
                state = placemark.administrativeArea!
                self.city = city
                self.state = state
            }
        }
    }
}

1 Ответ

0 голосов
/ 05 августа 2020

В своей функции вы не вызываете параметр completion:

func getCityStateFromPostalCode(zip: String, completion: @escaping () -> ()) {
    let geocoder = CLGeocoder()
    var city = ""
    var state = ""
    
    geocoder.geocodeAddressString(zip) { (placemarks, error) in
        if let placemark = placemarks?[0] {
            if placemark.postalCode == zip {
                city = placemark.locality!
                state = placemark.administrativeArea!
                self.city = city
                self.state = state
            }
        }
        completion() // <- add this (may be moved depending on the `error` parameter
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...