【问题标题】:Swift - adding a button to my MKPointAnnotationSwift - 向我的 MKPointAnnotation 添加一个按钮
【发布时间】:2015-10-14 11:08:53
【问题描述】:

在 Swift 1.2 上:我想在地图上的注释中添加一个按钮。首先点击 pin 会显示用户的 id,这可以正常工作,但是通过按下按钮,我想将用户发送到详细视图控制器。

你可以知道我在寻找什么herehere

尝试应用这些解决方案,但我认为我遗漏了一些东西。这是我正在寻找的另一个例子

这是我的班级声明:

import UIKit
import MapKit
import CoreLocation
import Parse

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate, UIActionSheetDelegate {

这是我想用按钮创建注释的代码部分:

    // MARK: - Create Annotation

    func createAnnotations(point: PFGeoPoint, address: String)
    {
        println("*** this evaluates n.3 ***")
        var query = PFUser.query()


        query?.whereKey("location", nearGeoPoint: point, withinKilometers: withinKms)
        query?.orderByAscending("location")  //MARK:  Put list in order

        //MARK: Not include current user on the map
        var me = PFUser.currentUser()?.username
        query?.whereKey("username", notEqualTo: me!)

        query?.limit = self.kLimitNumberForQueryResults


        query?.findObjectsInBackgroundWithBlock({ (objects, error) -> Void in

            if error == nil
            {
                for(var i = 0; i < objects!.count; i++) {

                    let user = objects![i] as! PFUser
                    var myHomePin = MKPointAnnotation()
                    let userPoint = user["location"] as! PFGeoPoint
                    myHomePin.coordinate = CLLocationCoordinate2DMake(userPoint.latitude, userPoint.longitude)
                    myHomePin.title = user.username

 //MARK: core of the problem                   
//                    let detailButton : UIButton = UIButton.buttonWithType(UIButtonType.DetailDisclosure) as! UIButton
//                    myHomePin.rightCalloutAccessoryView = detailButton
//




//                    myHomePin.subtitle = address
                    self.mapView.addAnnotation(myHomePin)
                    //                    self.closeUsersArray.append(user.username!) //MARK: Test

                }






//                    println("this is the array of users * \(self.closeUsersArray) *") //MARK: Test
            }
            else
            {
                println("Error: " + error!.localizedDescription)
            }

        })

    }

提前致谢!

【问题讨论】:

    标签: ios swift mkmapview mkannotationview mkpointannotation


    【解决方案1】:

    使用 'viewForAnnotation' 地图视图委托方法来设置 left 和 rightcalloutAccessories。并且 UIButton.buttonWithType 也被替换,这将起作用:编辑:你需要的所有委托方法,但我没有通过你的 createAnnotation 函数,因为你说它工作正常

    class MapViewController: UIViewController, MKMapViewDelegate //
    {
        @IBOutlet weak var mapView: MKMapView!{ //make sure this outlet is connected 
            didSet{
                mapView.delegate = self
            }
        }
    
        // MARK: - Map view delegate
    
        func mapView(mapView: MKMapView, viewForAnnotation annotation: MKAnnotation) -> MKAnnotationView? {
            var view = mapView.dequeueReusableAnnotationViewWithIdentifier("AnnotationView Id")
            if view == nil{
                view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "AnnotationView Id")
                view!.canShowCallout = true
            } else {
                view!.annotation = annotation
            }
    
            view?.leftCalloutAccessoryView = nil
            view?.rightCalloutAccessoryView = UIButton(type: UIButtonType.DetailDisclosure)
            //swift 1.2
            //view?.rightCalloutAccessoryView = UIButton.buttonWithType(UIButtonType.DetailDisclosure) as UIButton
    
            return view
        }
    
        func mapView(mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
            //I don't know how to convert this if condition to swift 1.2 but you can remove it since you don't have any other button in the annotation view
            if (control as? UIButton)?.buttonType == UIButtonType.DetailDisclosure { 
                    mapView.deselectAnnotation(view.annotation, animated: false)
                    performSegueWithIdentifier("you're segue Id to detail vc", sender: view)
                }
            } 
        }
    
        //Your function to load the annotations in viewDidLoad
    
    }
    

    【讨论】:

    • 我尝试将你的 func 放在我的“createAnnotations”之上,但得到了这个:MapViewController.swift:192:51: Extra argument 'type' in call
    • 你使用的是 Swift1.2 吗?该代码在 swift2.0 上运行良好
    • 我建议更新:)
    • Ps,你不应该把函数放在你的函数中。那是一个委托方法
    • 是的,我会的,但现在我必须在 1.2 上关闭它 :( 然后我会切换但把它放在一边,我在我的“createAnnotations”函数上方添加了你的函数,作为一个单独的函数,对吗?
    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多