草庐IT

ios - 第一次设置后,我似乎无法设置 MKMapView 注释标题

coder 2023-09-13 原文

发生的事情是我在搜索字段中输入一个地址,然后点击开始。找到位置并放大 map 。我单击图钉图像,弹出标题气泡并显示标题。

我创建了一个属性“pin”作为对 title 属性的引用。拖动到新位置完成后,我使用对新位置的引用设置属性标题标签。在 NSLog 中,属性显示为已更改。但是当我点击拖动到新位置并且拖动结束时,title 属性的相同原始值保持不变。

我已经查看了大量关于类似问题的问题,但没有任何效果。

这是我的 GO 按钮方法:

  @IBAction func didTapGoButton(sender: UIButton) {
        self.spinnerContainer.hidden = false
        var geocoder = CLGeocoder()
        geocoder.geocodeAddressString(searchField.text, {(placemarks: [AnyObject]!, error: NSError!) -> Void in
            if let placemark = placemarks?[0] as? CLPlacemark {


                var region = self.mapView.region as MKCoordinateRegion
                region.center = placemark.location.coordinate
                region.span.longitudeDelta = 0.0144927536
                region.span.latitudeDelta = 0.0144927536

                self.mapView.zoomEnabled = true
                self.mapView.scrollEnabled = true
                let pa = MKPointAnnotation()
                pa.coordinate = placemark.location.coordinate
                pa.title = "\(placemark.name), \(placemark.locality), \(placemark.country)"

                self.spinnerContainer.hidden = true
                self.mapView.addAnnotation(pa)
                self.pin = pa
                self.mapView.setRegion(region, animated: true)
                self.annotationTitle = pa.title
                self.searchField.text = ""

                //self.mapView.selectAnnotation(pa, animated: true)

                var newLocation = CLLocation(latitude: pa.coordinate.latitude, longitude: pa.coordinate.longitude)
                var geocoder = CLGeocoder()
                geocoder.reverseGeocodeLocation(newLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) -> Void in
                    if let placemark = placemarks?[0] as? CLPlacemark {


                      //  let pa = MKPointAnnotation()
                        pa.coordinate = placemark.location.coordinate
                        pa.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

                        NSLog("\(pa.title)")
                        self.addressFromCoordinates.text = pa.title
                        self.noAddressLabel.hidden = true

                    }
                })


            }

        })
    }

我的 viewForAnimation:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

    if annotation.isKindOfClass(MKUserLocation) {
        return nil
    }

    let reuseId = "pin"
    var pin = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)

    if pin == nil {
        NSLog("PIN NIL")
        pin = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
        pin.image = UIImage(named: "pin")
        pin.draggable = true
        pin.canShowCallout = true

    }
    else
    {
        NSLog("PIN NOT NIL")
        pin.annotation = annotation
    }
    return pin;
}

我的 didChangeDragState 方法:

 func mapView(mapView: MKMapView!, annotationView view: MKAnnotationView!, didChangeDragState newState: MKAnnotationViewDragState, fromOldState oldState: MKAnnotationViewDragState) {
        if newState == MKAnnotationViewDragState.Starting
        {
            view.dragState = MKAnnotationViewDragState.Dragging
        }
        else if newState == MKAnnotationViewDragState.Ending || newState == MKAnnotationViewDragState.Canceling
        {
            view.dragState = MKAnnotationViewDragState.None


            var newLocation = CLLocation(latitude: self.pin.coordinate.latitude, longitude: self.pin.coordinate.longitude)

            var geocoder = CLGeocoder()
            geocoder.reverseGeocodeLocation(newLocation, completionHandler: { (placemarks: [AnyObject]!, error: NSError!) -> Void in
                if let placemark = placemarks?[0] as? CLPlacemark {

                    let pa = MKPointAnnotation()
                    pa.coordinate = placemark.location.coordinate
                    pa.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

                    self.annotationTitle = pa.title

                    self.addressFromCoordinates.text = pa.title
                    self.editAddressButton.hidden = false
                    self.noAddressLabel.hidden = true
                }
            })
            NSLog("\(self.pin.coordinate.latitude), \(self.pin.coordinate.longitude)")
        }
    }

拖动后是否需要对 map View 进行某种刷新?

谢谢你的时间

最佳答案

didChangeDragState中,这段代码:

let pa = MKPointAnnotation()
pa.coordinate = placemark.location.coordinate
pa.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

self.annotationTitle = pa.title

没有更新刚刚拖动的注释的 title,因为:

  1. pa.title = ... 中的 pa 指的是一个new 实例MKPointAnnotation 没有以任何方式连接到刚刚拖动的注释。 let pa = MKPointAnnotation() 行创建了一个新的 MKPointAnnotation 实例。这个新实例只存在于本地内存中,甚至没有添加到 map 中。

  2. self.annotationTitle 的更新对刚刚拖动的注释实例的 title 没有影响,因为 annotationTitle 是只是你声明的一些单独的字符串变量和添加到 map 并被拖动的原始 MKPointAnnotationannotationTitle 没有任何知识或联系(事实上 annotationTitle 最初设置为等于 didTapGoButton 中注释的 title 不会以某种方式将两个字符串“链接”在一起)。


didTapGoButton 中,您将在 pin 变量中保存对实际添加(然后拖动)的注释对象的引用。此 pin 变量是您可以用来更新被拖动注释的 title 的引用(假设您将只有 一个 注释在时间)。

所以在didChangeDragState中,将上面显示的代码更改为:

self.pin.coordinate = placemark.location.coordinate
self.pin.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

self.annotationTitle = self.pin.title


但是,根据您的要求,请注意,一开始就没有必要保留您自己对注释的引用......

didChangeDragState 中,您可以访问直接从传递到方法中的 view 参数拖动的注释。例如:

let ann = view.annotation as MKPointAnnotation
ann.coordinate = placemark.location.coordinate
ann.title = "\(placemark.name), \(placemark.locality), \(placemark.administrativeArea), \(placemark.country), \(placemark.postalCode)"

self.annotationTitle = ann.title


旁注:
拖动注释并对新位置进行反向地理编码后,地理编码坐标很可能与用户将注释拖动到的位置不同。发生这种情况是因为最近的地理编码地址可能离注释被拖动到的位置稍远。所以会发生什么是注释会在用户完成拖动后移动一点。如果您希望将注释准确地保留在用户拖动它的位置,请不要在地理编码器的完成 block 中更新注释的 coordinate,而只更新 title。如果地理编码地址与实际坐标相距 X 米或更远,您可能希望将标题设置为类似“near xyz”的内容。

关于ios - 第一次设置后,我似乎无法设置 MKMapView 注释标题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25840476/

有关ios - 第一次设置后,我似乎无法设置 MKMapView 注释标题的更多相关文章

  1. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby-openid:执行发现时未设置@socket - 2

    我在使用omniauth/openid时遇到了一些麻烦。在尝试进行身份验证时,我在日志中发现了这一点:OpenID::FetchingError:Errorfetchinghttps://www.google.com/accounts/o8/.well-known/host-meta?hd=profiles.google.com%2Fmy_username:undefinedmethod`io'fornil:NilClass重要的是undefinedmethodio'fornil:NilClass来自openid/fetchers.rb,在下面的代码片段中:moduleNetclass

  4. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  5. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  6. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - 如何使用 instance_variable_set 正确设置实例变量? - 2

    我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击

  9. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  10. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

随机推荐