Swift – 从地图中的当前位置选择注释的方向
我的应用程序目前有一个本地搜索,为搜索结果添加注释.我想设置它,当您选择注释并单击调出按钮时,它将在地图应用程序中打开,其中包含指向当前设备位置的注释的说明.我遇到了一些问题.
首先,我没有出现注释上的调出按钮.其次,我认为我没有正确检测选定的注释. 这是我的搜索和选定注释的代码: func performSearch() { matchingItems.removeAll() let request = MKLocalSearchRequest() request.naturalLanguageQuery = searchText.text request.region = mapView.region let search = MKLocalSearch(request: request) search.startWithCompletionHandler({(response: MKLocalSearchResponse!,error: NSError!) in if error != nil { println("Error occured in search: (error.localizedDescription)") } else if response.mapItems.count == 0 { println("No matches found") } else { println("Matches found") for item in response.mapItems as! [MKMapItem] { println("Name = (item.name)") println("Phone = (item.phoneNumber)") self.matchingItems.append(item as MKMapItem) println("Matching items = (self.matchingItems.count)") var annotation = MKPointAnnotation() var coordinates = annotation.coordinate annotation.coordinate = item.placemark.coordinate annotation.title = item.name self.mapView.addAnnotation(annotation) } } }) } func mapView(mapView: MKMapView!,annotationView view: MKAnnotationView!,calloutAccessoryControlTapped control: UIControl!) { if self.mapView.selectedAnnotations?.count > 0 { if let selectedLoc = self.mapView.selectedAnnotations[0] as? MKAnnotation { println("Annotation has been selected") let currentLoc = MKMapItem.mapItemForCurrentLocation() let mapItems = NSArray(objects: selectedLoc,currentLoc) let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving] MKMapItem.openMapsWithItems([selectedLoc,currentLoc],launchOptions: launchOptions) } } } 任何帮助将不胜感激,提前谢谢.
第一期:
需要在viewForAnnotation委托方法中显式设置callout按钮(默认红色引脚没有).以下是一个可能实现的简单示例: func mapView(mapView: MKMapView!,viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! { if annotation is MKUserLocation { return nil } let reuseId = "pin" var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView if pinView == nil { pinView = MKPinAnnotationView(annotation: annotation,reuseIdentifier: reuseId) pinView!.canShowCallout = true pinView!.pinColor = .Purple //next line sets a button for the right side of the callout... pinView!.rightCalloutAccessoryView = UIButton.buttonWithType(.DetailDisclosure) as! UIButton } else { pinView!.annotation = annotation } return pinView } 对于第二个问题: 首先,在calloutAccessoryControlTapped中,可以使用view.annotation直接访问注释,因此使用selectedAnnotations数组是不必要的. 接下来,openMapsWithItems需要一个MKMapItem对象数组,但是在你传递的数组中([selectedLoc,currentLoc]),selectedLoc不是MKMapItem – 它只是一个实现MKAnnotation的对象. 运行此代码将导致此错误崩溃:
当地图应用尝试使用selectedLoc时,就像它是MKMapItem一样. 相反,您需要从selectedLoc注释创建MKMapItem.这可以通过首先使用MKPlacemark(坐标:addressDictionary :)从注释创建MKPlacemark,然后使用MKMapItem(地标:)从地标创建MKMapItem来完成. 例: func mapView(mapView: MKMapView!,calloutAccessoryControlTapped control: UIControl!) { let selectedLoc = view.annotation println("Annotation '(selectedLoc.title!)' has been selected") let currentLocMapItem = MKMapItem.mapItemForCurrentLocation() let selectedPlacemark = MKPlacemark(coordinate: selectedLoc.coordinate,addressDictionary: nil) let selectedMapItem = MKMapItem(placemark: selectedPlacemark) let mapItems = [selectedMapItem,currentLocMapItem] let launchOptions = [MKLaunchOptionsDirectionsModeKey: MKLaunchOptionsDirectionsModeDriving] MKMapItem.openMapsWithItems(mapItems,launchOptions:launchOptions) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- SQLite剖析(6):临时文件和内存数据库
- c#linq生成超过限制的查询长度.我们有什么方法可以解除这个
- centos 7安装mysql5.5和安装 mariadb使用的命令
- ajax方式和springMVC数据交互
- ruby-on-rails – Rails 3和PDFKit,如何将HTML文件转换为横
- Ajax
- 设计模式六大原则(2):里氏替换原则
- ios – 获取错误Receiver for class message是一个前向声明
- swift – ‘(String,AnyObject)’不能转换为'[String:
- ruby-on-rails – 为什么assert_select不接受参数rails 4.2