草庐IT

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

coder 2023-09-10 原文

环境:

  • 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/

有关ios - 网点重命名自己?破坏 geocodeAddressString()?的更多相关文章

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. ruby-on-rails - 如何重命名或移动 Rails 的 README_FOR_APP - 2

    当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?

  3. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  4. ruby - rails 3 redirect_to 将参数传递给命名路由 - 2

    我没有找到太多关于如何执行此操作的信息,尽管有很多关于如何使用像这样的redirect_to将参数传递给重定向的建议:action=>'something',:controller=>'something'在我的应用程序中,我在路由文件中有以下内容match'profile'=>'User#show'我的表演Action是这样的defshow@user=User.find(params[:user])@title=@user.first_nameend重定向发生在同一个用户Controller中,就像这样defregister@title="Registration"@user=Use

  5. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. ruby-on-rails - Rails - 从命名路由中提取 HTTP 动词 - 2

    Rails中有没有一种方法可以提取与路由关联的HTTP动词?例如,给定这样的路线:将“users”匹配到:“users#show”,通过:[:get,:post]我能实现这样的目标吗?users_path.respond_to?(:get)(显然#respond_to不是正确的方法)我最接近的是通过执行以下操作,但它似乎并不令人满意。Rails.application.routes.routes.named_routes["users"].constraints[:request_method]#=>/^GET$/对于上下文,我有一个设置cookie然后执行redirect_to:ba

  8. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  9. ruby-on-rails - OS X Mavericks 破坏了 rbenv? - 2

    最近,我安装了OSXMavericks,它似乎弄乱了我的开发环境。我在运行“railsnewfirst_app”后收到此消息:Youruseraccountisn'tallowedtoinstalltothesystemRubygems.Youcancancelthisinstallationandrun:bundleinstall--pathvendor/bundletoinstallthegemsinto./vendor/bundle/,oryoucanenteryourpasswordandinstallthebundledgemstoRubygemsusingsudo.Pass

  10. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

随机推荐