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 视图中使用按钮? [关闭]

SwiftUI 使用 onTapGesture 和 onLongPressGesture 处理按钮/视图以及释放操作

swiftUI:登录完成后导航到主屏幕。通过按钮单击导航视图

如何将 swiftUI 按钮连接到 NSView 操作?

SwiftUI 中按钮操作内的 ForEach 循环?

SwiftUI:contextMenu 菜单