salidas renombrando ellos mismos? rompiendo geocodeAddressString ()?

Ambiente:

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

Visión de set:

    Tengo lo que, para mí, es un problema extraño con respecto a los Outlets , que parecen cambiar el nombre de su objective cuando se configuran y, creo, es la fuente de los problemas que estoy teniendo con geocodeAddressString()

Un poco de historia de background:

  • Mi opinión tiene una serie de elementos, pero a los efectos de esta publicación, me preocupa principalmente el UITextField y cómo creo que están afectando mi código MKMapView (basado en algo en los comentarios que vi aquí)
  • Mi UITextField está utilizando una forma ligeramente modificada de una extensión (originalmente por 'nhgrif') que encontré aquí, donde el objective es poder configurar una cadena de margaritas de campos de text, tal como presionar el button Siguiente (o Retorno ) en el keyboard emergente pasará automáticamente al siguiente campo de text deseado (o en algunos casos, anterior).

     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) } } } 
  • Desde la perspectiva de Xcode / Storyboard, proporciona las siguientes interfaces de usuario para configurar el siguiente (y / o anterior) campo en la cadena:

Perforación

    No estoy seguro de cómo explicar realmente el problema que estoy viendo que no sea con un video de captura de pantalla, pero como no puedo entender cómo publicar esto aquí, habrá que hacer un montón de capturas de pantalla …

    • Comience con el campo Nombre y configure nextField to Address :
    • A continuación, select el campo Dirección y configure el campo previousField a Nombre y el nextField a Ciudad :

      Hasta ahora, todo parece estar funcionando bien …

    • Ahora select el campo Ciudad y configure el campo previousField a Dirección y el nextField a Estado :

      ¡Sí! Tenga en count que el nombre asociado con el campo Estado ahora es " Campo siguiente "

    • Continúa con el campo Estado , configurando el campo previousField a Ciudad y el nextField a Código postal :

      El campo Estado sigue apareciendo como " Campo siguiente " y ahora el campo Código postal TAMBIÉN aparece como " Campo siguiente "

    • Termine con el campo Código postal , configurando el campo previousField a Estado , dejando intencionadamente el nextField configurar:

    Algún más código

      Aquí está la mayor parte del rest del código de esta class de vista particular

       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.desinetworkingAccuracy = 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) { //... } } 
    • Al ejecutar la aplicación, al completar todos los campos, cuando hago clic en el button 'Listo' en el keyboard numérico asociado con el campo Código postal, obtengo una exception. El logging de debugging se ve así:
      •  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) 
    • La exception aparece como:

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

      Y sí, he verificado que no tengo puntos de interrupción establecidos en el código

    Suma

    Estoy razonablemente seguro de que el código geocodeAddressString() es correcto (lo usé en otra aplicación para Swift-2), pero desconfío mucho de cómo se renombran los estados y Zipcode Outlets cuando bash encadenarlos con el otros campos.
    ¿Alguien tiene alguna idea?

    Sugeriría deshacerse de esos varios models:

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

    Es más fácil dejar que infiera los types correctos para usted.


    Con respecto a la denominación de los puntos de venta, el IB está tratando de facilitarle la vida, nombrando su nombre en ausencia de un nombre específico. Pero con estos sockets adicionales, su algorithm pnetworkingeterminado está fallando. Probablemente pueda evitar esto nombrando los puntos de venta usted mismo en la sección "Documento" del "Inspector de identidad".