gpt4 book ai didi

ios - 网点重命名自己?破坏 geocodeAddressString()?

转载 作者:搜寻专家 更新时间:2023-10-31 22:59:05 25 4
gpt4 key购买 nike

环境:

  • Xcode-8
  • iOS-10
  • Swift-3

概述:

    对我来说,关于 Outlets 的一个奇怪问题,它似乎在设置时更改了目标的名称,我相信,这是我遇到的问题的根源我有 geocodeAddressString()

一些背景故事:

  • 我的 View 有许多元素,但出于本文的目的,我主要关注 UITextField 以及我认为它们如何影响我的 MKMapView 代码(基于我在这里看到的评论)
  • 我的 UITextField 正在使用一种稍微修改过的扩展(最初由“nhgrif”开发),我在这里找到了它,目的是能够设置文本字段的菊花链,这样点击弹出键盘上的 Next(或 Return)按钮将自动进入所需的下一个(或在某些情况下,上一个) ) 文本框。

    private var kAssociationKeyNextField:     UInt8 = 0
    private var kAssociationKeyPreviousField: UInt8 = 1 // I added this

    extension UITextField {
    @IBOutlet var nextField: UITextField? {
    get { return objc_getAssociatedObject(self, &kAssociationKeyNextField) as? UITextField }
    set(newField) { objc_setAssociatedObject(self, &kAssociationKeyNextField, newField, .OBJC_ASSOCIATION_RETAIN) }
    }
    // I added the following
    @IBOutlet var previousField: UITextField? {
    get { return objc_getAssociatedObject(self, &kAssociationKeyPreviousField) as? UITextField }
    set(newField) { objc_setAssociatedObject(self, &kAssociationKeyPreviousField, newField, .OBJC_ASSOCIATION_RETAIN) }
    }
    }

  • 从 Xcode/Storyboard 的角度来看,这提供了以下 UI,用于设置菊花链中的下一个(和/或上一个)字段:

向下钻取

    除了截屏视频之外,我不确定如何真正解释我所看到的问题,但由于我无法弄清楚如何在此处发布此类内容,因此必须使用大量屏幕截图...
    • Name 字段开始,将 nextField 设置为 Address :
    • 然后选择 Address 字段并将 previousField 设置为 NamenextFieldCity:
      到目前为止,一切似乎都很好......
    • 现在选择City 字段并将previousField 设置为AddressnextFieldState:
      Yikes!请注意,与 State 字段关联的名称现在是“Next Field
    • 继续State 字段,将previousField 设置为CitynextFieldZipcode:
      State 字段仍显示为“Next Field”- 现在 邮政编码 字段 ALSO 显示为“下一个字段
    • 完成 Zipcode 字段,将 previousField 设置为 State -故意不设置 nextField:

    更多代码

      这是此特定 View 类代码的 大部分其余部分

      class NewLocationViewController: UIViewController, CLLocationManagerDelegate, UITextFieldDelegate {

      @IBOutlet weak var doGeoLocate: UISwitch!
      @IBOutlet weak var name: UITextField!
      @IBOutlet weak var address: UITextField!
      @IBOutlet weak var city: UITextField!
      @IBOutlet weak var state: UITextField!
      @IBOutlet weak var zipcode: UITextField!
      @IBOutlet weak var done: UIBarButtonItem!
      @IBOutlet weak var map: MKMapView!

      var coords: CLLocationCoordinate2D?
      var locationManager: CLLocationManager = CLLocationManager()
      var currentLocation: CLLocation!

      override func viewDidLoad() {
      super.viewDidLoad()

      name.delegate = self
      address.delegate = self
      city.delegate = self
      state.delegate = self
      zipcode.delegate = self

      locationManager.requestWhenInUseAuthorization()
      if CLLocationManager.locationServicesEnabled() {
      locationManager.desiredAccuracy = kCLLocationAccuracyBest
      locationManager.delegate = self
      locationManager.startUpdatingLocation()
      }
      currentLocation = nil
      doGeoLocate.isOn = false
      map.isHidden = true
      done.isEnabled = false

      navigationController?.isNavigationBarHidden = false
      navigationController?.isToolbarHidden = false
      }

      func textFieldShouldReturn(_ textField: UITextField) -> Bool {
      if doGeoLocate.isOn == true {
      textField.resignFirstResponder()
      }
      else if textField.nextField == nil {
      if (!checkFields()) {
      // walk back up chain to find last non-filled text-field...
      var tmpField = textField
      while ((tmpField.previousField != nil) && (tmpField.previousField?.hasText)!) {
      tmpField = tmpField.previousField!
      }
      tmpField.previousField?.becomeFirstResponder()
      }
      else {
      textField.resignFirstResponder()
      }
      }
      else {
      textField.nextField?.becomeFirstResponder()
      }
      return checkFields()
      }

      func checkFields() -> Bool {
      //... if doGeoLocate switch is on - return true
      //... if ALL fields are populated, call geocodeAddress() and return true
      //... otherwise return false
      }

      func geocodeAddress() {
      print("GA") //#=#
      let geoCoder = CLGeocoder()
      let addr = "\(address.text) \(city.text) \(state.text) \(zipcode.text)"
      print("ADDR: `\(addr)'")//#=#
      geoCoder.geocodeAddressString(addr, completionHandler: {
      (placemarks: [CLPlacemark]?, error: NSError?) -> Void in
      print("IN geocodeAddressString")//#=#
      //if error.localizedDescription.isEmpty == false {
      // print("Geocode failed with error: \(error.localizedDescription)")
      //}
      //else if placemarks!.count > 0 {
      let placemark = placemarks![0]
      let location = placemark.location
      self.coords = location!.coordinate
      self.map.isHidden = false
      //}
      } as! CLGeocodeCompletionHandler) //<<<=== NOTE THIS LINE
      }

      func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
      //...
      }

      @IBAction func toggleGeoLocate(_ sender: AnyObject) {
      //...
      }

      @IBAction func useNewLocation(_ sender: AnyObject) {
      //...
      }
      }

    • 在运行应用程序并填写所有字段后,当我点击与邮政编码字段关联的数字小键盘中的“完成”按钮时,出现异常。调试日志如下所示:

        TFSR: (TFSR Optional("Name") => Optional("Address"))
        Returning false
        TFSR: (TFSR Optional("Address") => Optional("City"))
        Returning false
        TFSR: (TFSR Optional("City") => Optional("State"))
        Returning false
        TFSR: (TFSR Optional("State") => Optional("Zipcode"))
        Returning false
        GA
        ADDR: `Optional("2112 Murray Avenue ") Optional("Pittsburgh ") Optional("PA") Optional("15217")'
        (lldb)

    • 异常显示为:

            func geocodeAddress() {
        //...
        geoCoder.geocodeAddressString(addr, completionHandler: {
        (placemarks: [CLPlacemark]?, error: NSError?) -> Void in
        //...
        } as! CLGeocodeCompletionHandler) //<<< Thread 1: EXC_BREAKPOINT (code=1, subcode=0x10006c518)
        }

      是的,我确认我没有在代码中设置断点

    总结

    我有理由相信 geocodeAddressString() 代码是正确的(我在 Swift-2 的另一个应用程序中使用了它),但我当我尝试将 State 和 Zipcode Outlets 与其他字段链接起来时,我对重命名它们的方式非常怀疑。
    有人有任何想法吗?

最佳答案

我建议摆脱那些各种各样的类型转换:

func geocodeAddress() {
//...
geoCoder.geocodeAddressString(addr) { placemarks, error in
//...
}
}

让它为您推断正确的类型是最简单的方法。


关于网点的命名,兴业银行为了方便您,在没有指定名称的情况下为您命名。但是有了这些额外的 channel ,它的默认算法就不够用了。您可以通过在“身份检查器”的“文档”部分中自己命名导出来解决这个问题。

关于ios - 网点重命名自己?破坏 geocodeAddressString()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39644370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com