SwiftUI - 我可以在按钮操作中使用完成处理程序吗?
Posted
技术标签:
【中文标题】SwiftUI - 我可以在按钮操作中使用完成处理程序吗?【英文标题】:SwiftUI - Can I use a completion handler in Button action? 【发布时间】:2020-08-04 20:55:40 【问题描述】:我有一个获取新用户名和邮政编码的表单。当用户按下保存时,我使用 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】:在您的函数中,您没有调用 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
【讨论】:
以上是关于SwiftUI - 我可以在按钮操作中使用完成处理程序吗?的主要内容,如果未能解决你的问题,请参考以下文章
SwiftUI 使用 onTapGesture 和 onLongPressGesture 处理按钮/视图以及释放操作