网点改名自己?打破geocodeAddressString()?

时间:2016-09-22 16:31:59

标签: ios swift swift3 ios10

环境:

  • 的Xcode-8
  • IOS的​​10
  • 夫特-3
  • < / UL>

    概述:

      对于我来说,对于奥特莱斯来说,我有一个奇怪的问题,它似乎在设置时改变了目标的名称,我相信,这是问题的根源我和geocodeAddressString()在一起

    一些背景故事:

        
    • 我的观点有很多元素,但就本次发布而言,我主要关注UITextField以及我认为它们如何影响我的MKMapView代码(基于我在这里看到的评论)
    •   
    • 我的UITextField正在使用稍微修改过的扩展程序(最初由&#39; nhgrif&#39;),我在这里找到的目标是能够设置菊花链文本字段,以便按下弹出键盘上的 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:

    向下钻取

        我不确定如何真正解释我除了屏幕截图视频之外还能看到的问题,但由于我无法弄清楚如何发布此类信息,因此需要进行一系列屏幕截图。
      • 名称 字段开始,并将nextField设置为 地址
      • 然后选择 地址 字段并将previousField设置为 名称 和{{ 1}}到 城市
        到目前为止,一切似乎都运转良好......
      • 现在选择 城市 字段并将nextField设置为 地址 和{{ 1}}到
        Yikes!请注意,与 字段相关联的名称现在是&#34; 下一个字段 &#34;
      • 继续 字段,将previousField设置为 城市 和{{1转到 邮政编码
        字段仍显示为&#34; 下一个字段 < /强>&#34; - 现在 Zipcode 字段 ALSO 显示为&#34; 下一个字段 &#34;
      • 点击 邮政编码 字段,将nextField设置为 - 故意离开previousField未设置:

      更多代码

            以下是此特定视图类的其余部分的大多数

        nextField

      • 运行应用程序,填写所有字段,当我点击“完成”按钮时与Zipcode字段关联的数字小键盘中的按钮 - 我得到一个例外。调试日志如下所示:

          previousField

      • 例外情况显示为:

          nextField

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

      求和

      我有理由确定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) { //... } } 代码是正确的(我在Swift-2的另一个应用中使用过它),但我&#39;当我尝试将其与其他字段链接时,我非常怀疑State和Zipcode Outlets 的重命名方式。
      任何人都有任何想法吗?

1 个答案:

答案 0 :(得分:1)

我建议摆脱那些不同的演员:

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

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

关于网点的命名,IB正试图让您的生活更轻松,在没有任何指定名称的情况下为您命名。但是通过这些额外的出口,其默认算法不足。你可以通过在&#34; Document&#34;中自己命名出口来解决这个问题。 &#34; Identity Inspector&#34;。

的一部分