Uibutton传递位置信息并开始在swift地图上导航

时间:2016-07-13 07:36:11

标签: swift uitableview mapkit

我有一个CLLocationcooridinate2d的数组内容和位置详细信息。我把它放在带有Uibutton的tableview单元格上,我正在做的是试图通过Uibuttom传递特定的单元格信息并开始一个新的地图视图视图并开始导航。这是我的代码:

   var tripspot:[tripSpot] = [
    tripSpot( title: "一中商圈", coordinate: CLLocationCoordinate2DMake(24.149062, 120.684891), regionRadius: 300.0, location: "台中市北區一中街", type: "Food",cllocation:CLLocation(latitude: 24.181143,  longitude: 120.593158))


 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("MapCell") as! mapTableViewCell
    if  searchController.active{
    cell.title.text = searchResults[indexPath.row].title
    cell.location.text = searchResults[indexPath.row].location
    cell.naviButton.tag = indexPath.row
    cell.naviButton.addTarget(self, action: Selector("tapDidNavi"), forControlEvents: .TouchUpInside)

    return cell
    }else{
    cell.title.text = tripspot[indexPath.row].title
    cell.location.text = tripspot[indexPath.row].location
    cell.naviButton.tag = indexPath.row
    cell.naviButton.addTarget(self, action: Selector("tapDidNavi"), forControlEvents: .TouchUpInside)
    print(cell.naviButton.tag.description)
    return cell
    }


 }

@IBAction func tapDidNavi(sender: UIButton){



}

感谢任何建议!

4 个答案:

答案 0 :(得分:5)

您可以使用MKMapItem.openMapsWithItems:launchOptions:在地图应用中启动精细导航。

来自文档:

  

如果在中指定MKLaunchOptionsDirectionsModeKey选项   launchOptions字典,mapItems数组必须不超过   其中有两个项目。如果数组包含一个项目,则为地图应用   生成从用户当前位置到该位置的路线   由地图项指定。如果数组包含两个项目,则为Maps   应用程序生成从第一个项目的位置到的方向   数组中第二项的位置。

@IBAction func tapDidNavi(sender: UIButton){

    let location = self.tripspot[sender.tag]

    let placemark = MKPlacemark(
        coordinate: coordinate, 
        addressDictionary: nil
    )

    let mapItem = MKMapItem(placemark: placemark)
    mapItem.name = location.title

    let options = [
        MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving
    ]

    MKMapItem.openMapsWithItems([mapItem], launchOptions: options)
}

答案 1 :(得分:1)

我真的不了解你的问题。也许你的问题并不具体。但是,如果按钮操作不起作用。你可以这样做;

protocol ButtonDelegate {
func buttonPressedOnIndexPath(indexPath : NSIndexPath)
}

extension ViewController : UITableViewDataSource {
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 1
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("TableViewCell") as! TableViewCell

    cell.indexPath = indexPath
    cell.delegate = self 
    return cell
}

extension ViewController : ButtonDelegate {
func buttonPressedOnIndexPath(indexPath: NSIndexPath) {
    //use the indexpath.row for the array
    print("indexPath : \(indexPath.row)")
}}

 class TableViewCell: UITableViewCell {
   var delegate : ButtonDelegate!
   var indexPath : NSIndexPath!

   @IBOutlet weak var naviButton: UIButton!

   @IBAction func buttonPressed(sender: UIButton) {
      delegate.buttonPressedOnIndexPath(indexPath)
   }
}

我希望它有所帮助

答案 2 :(得分:1)

在这个SO问题中可能会有一些建议:Passing parameters on button action:@selector

正如您在UIButton上设置了tag属性,您可以在tapDidNavi中访问此参数,并使用它来从数组中获取CLLocationCoordinate2D。

您接下来要做的事情取决于您设置应用的方式。如果你是将mapview放在不同的viewcontroller中并设置segue,你可以调用

performSegueWithIdentifier("identifer", sender: <CLLocationCoordinate2D object>)

答案 3 :(得分:1)

尝试此代码,AppleMap将打开从设备当前位置标记的指示到指定坐标的位置。

    let coordinate = CLLocationCoordinate2DMake(currentLat, currentLong)
    let mapItem = MKMapItem(placemark: MKPlacemark(coordinate: coordinate, addressDictionary:nil))
    mapItem.name = “Destination/Target Address or Name”
    mapItem.openInMapsWithLaunchOptions([MKLaunchOptionsDirectionsModeKey : MKLaunchOptionsDirectionsModeDriving])