我是快速编程的新手。我希望当用户点击MKAnnotationPoint以在下一个视图控制器上移动时。我现在这样做的方法是按下按钮"按钮"正如你在image1顶部看到的那样。我的代码:
mapViewController.swift
import UIKit
import MapKit
import CoreLocation
class mapViewController: UIViewController, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, CLLocationManagerDelegate, MKMapViewDelegate {
// MARK: Properties
let pin = UIImage(named: "pin")
var annotationTouched = String()
var viaSegue = MKAnnotationView()
// MARK: MAP
@IBOutlet weak var mapView: MKMapView!
let coreLocationManager = CLLocationManager()
let locations = LocationList().Location
// all locations will be stored on this array
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])
{
let location = locations [0]
//map zoomed
let span:MKCoordinateSpan = MKCoordinateSpanMake(0.003, 0.003)
//users location
let myLocation:CLLocationCoordinate2D = CLLocationCoordinate2DMake(location.coordinate.latitude, location.coordinate.longitude)
let region:MKCoordinateRegion = MKCoordinateRegionMake(myLocation, span)
mapView.setRegion(region, animated: true)
self.mapView.showsUserLocation = true
}
// func to change red pin to my custom pin
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView?
{
if let annotation = annotation as? Locations{
if let view = mapView.dequeueReusableAnnotationView(withIdentifier: annotation.identifier){
return view
}else{
let view = MKAnnotationView(annotation: annotation, reuseIdentifier: annotation.identifier)
view.image = pin
view.isEnabled = true
view.canShowCallout = true
//view.leftCalloutAccessoryView = UIImageView(image: pin)
let btn = UIButton(type: .detailDisclosure)
view.rightCalloutAccessoryView = btn
return view
}
}
return nil
}
// assigning the pin that is selected in the map to the annotation touched variable
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
{
if let annotation = view.annotation as? Locations {
annotationTouched = annotation.title ?? "No title"
}
}
override func viewDidLoad()
{
super.viewDidLoad()
coreLocationManager.delegate = self
//desired accuracy is the best accuracy, very accurate data for the location
coreLocationManager.desiredAccuracy = kCLLocationAccuracyBest
//request authorization from the user when user using my app
coreLocationManager.requestWhenInUseAuthorization()
coreLocationManager.startUpdatingLocation()
mapView.delegate = self
mapView.addAnnotations(locations)
}
// passing the name of the place on the next view controller which is the review view controller (RateViewController)
override func prepare(for segue: UIStoryboardSegue, sender: Any?)
{
let destViewController : RateViewController = segue.destination as! RateViewController
destViewController.placeLabelString = annotationTouched
}
}
Locations.swift
import UIKit
import MapKit
class Locations: NSObject, MKAnnotation {
// required coordinate, title, and the reuse identifier for this annotation
var identifier = "locations"
var title: String?
var coordinate: CLLocationCoordinate2D
//initializer taking a name, a latitude and longitude to populate the title and coordinate for each instance of this object
init(name:String,lat:CLLocationDegrees,long:CLLocationDegrees){
title = name
coordinate = CLLocationCoordinate2DMake(lat, long)
}
}
// Creating the list of the places that will be pinned in map
class LocationList: NSObject {
var Location = [Locations]()
override init(){
Location += [Locations(name: "Dio Con Dio", lat: 40.590130, long: 23.036610)]
Location += [Locations(name: "Paradosiako - Panorama", lat: 40.590102, long:23.036180)]
Location += [Locations(name: "Veranda", lat: 40.607740, long: 23.103044)]
Location += [Locations(name: "Markiz", lat: 40.634252, long: 22.936276)]
Location += [Locations(name: "Moi Lounge Bar", lat: 40.653481, long: 22.994131)]
Location += [Locations(name: "Boulevard Lounge Bar", lat: 40.658462, long: 22.983198)]
Location += [Locations(name: "Ernést Hébrard", lat: 40.631829, long: 22.941014)]
Location += [Locations(name: "Tribeca - All Day & Night Bar", lat: 40.631029, long: 22.942396)]
}
}
答案 0 :(得分:2)
从mapViewController
到destination viewController
创建一个segue,然后执行以下操作:
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView) {
self.performSegue(withIdentifier: "destViewController", sender: nil)
}
Here是我创建的示例项目,向您展示它是如何工作的。
答案 1 :(得分:0)
将一个按钮与地图视图分开似乎是一种不恰当的方式来做这样的事情。您应该在注释视图上使用按钮,就像您拥有的详细信息项一样。当用户按下注释视图上的详细信息按钮时,下面的代码将转到添加审阅控制器。您需要将MKPointAnnotation
更改为Locations
,因为您尚未提供该自定义类的代码。
import UIKit
import MapKit
import CoreLocation
class MapViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate {
@IBOutlet weak var mapView: MKMapView!
let locationManager: CLLocationManager = {
let manager = CLLocationManager()
manager.requestWhenInUseAuthorization()
manager.desiredAccuracy = kCLLocationAccuracyBest
manager.startUpdatingLocation()
return manager
}()
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.locationManager.delegate = self
self.mapView.addAnnotations(LocationList().Location)
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// When the user's location updates, the map will be recentered on the user. This does the same as all your code.
self.mapView.setUserTrackingMode(.follow, animated: true)
}
func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
if let pin = annotation as? Locations {
let view = mapView.dequeueReusableAnnotationView(withIdentifier: "pin") ?? MKPinAnnotationView(annotation: pin, reuseIdentifier: "pin")
view.canShowCallout = true
view.image = UIImage(named: "pin")
let reviewButton = UIButton(type: .detailDisclosure)
reviewButton.addTarget(self, action: #selector(self.addReview), for: .touchUpInside)
view.rightCalloutAccessoryView = reviewButton
return view
}
return nil
}
func addReview(){
// This gets called with the detail declosure button is pressed.
// This gets the selected pin.
if let pin = self.mapView.selectedAnnotations.first as? Locations {
// This gets the view controller from your storyboard
guard let vc = self.storyboard?.instantiateViewController(withIdentifier: "ReviewViewController") as? ReviewViewController else { return }
// This passes the locations pin to the review view controller
vc.pin = pin
// This shows the review view controller
self.navigationController?.pushViewController(vc, animated: true)
}
}
}
class ReviewViewController: UIViewController {
@IBOutlet weak var locationLabel: UILabel!
@IBOutlet weak var reviewTextField: UITextField!
var pin: Locations!
override func viewDidLoad() {
super.viewDidLoad()
self.navigationItem.title = "Write a Review"
self.locationLabel.text = pin.title
let sendButton = UIBarButtonItem(title: "Send", style: .done, target: self, action: #selector(self.submitReview))
self.navigationItem.rightBarButtonItem = sendButton
}
func submitReview(){
print("Your review is: \(self.reviewTextField.text ?? "Why didn't you write anything?")")
}
}
class Locations: NSObject, MKAnnotation {
var title: String?
var coordinate: CLLocationCoordinate2D
init(name:String,lat:CLLocationDegrees,long:CLLocationDegrees){
title = name
coordinate = CLLocationCoordinate2DMake(lat, long)
}
}
class LocationList: NSObject {
var Location = [Locations]()
override init(){
Location += [Locations(name: "Dio Con Dio", lat: 40.590130, long: 23.036610)]
Location += [Locations(name: "Paradosiako - Panorama", lat: 40.590102, long:23.036180)]
Location += [Locations(name: "Veranda", lat: 40.607740, long: 23.103044)]
Location += [Locations(name: "Markiz", lat: 40.634252, long: 22.936276)]
Location += [Locations(name: "Moi Lounge Bar", lat: 40.653481, long: 22.994131)]
Location += [Locations(name: "Boulevard Lounge Bar", lat: 40.658462, long: 22.983198)]
Location += [Locations(name: "Ernést Hébrard", lat: 40.631829, long: 22.941014)]
Location += [Locations(name: "Tribeca - All Day & Night Bar", lat: 40.631029, long: 22.942396)]
}
}