2016-04-26 11 views
0

Ich möchte den Button in einem Pin mit einem anderen View Controller verbinden, in der func mapView anstatt zu drucken ("Disclosure Pressed"). Wenn Sie auf die Schaltfläche tippen, wird ein neuer View Controller mit einem Teil der Karte und weiteren Dingen angezeigt.Wie kann ich einen View Controller programmgesteuert über eine Schaltfläche mit Swift 2 öffnen?

import UIKit 
import MapKit 

protocol HandleMapSearch { 
func dropPinZoomIn(placemark:MKPlacemark) 
} 

class ViewController: UIViewController { 
let locationManager = CLLocationManager() 
var resultSearchController:UISearchController? = nil 
var selectedPin:MKPlacemark? = nil 


@IBOutlet weak var mapView: MKMapView! 

override func viewDidLoad() { 


    super.viewDidLoad() 
    locationManager.delegate = self 
    locationManager.desiredAccuracy = kCLLocationAccuracyBest 
    locationManager.requestWhenInUseAuthorization() 
    locationManager.requestLocation() 

    // 
    let locationSearchTable = storyboard!.instantiateViewControllerWithIdentifier("LocationSearchTable") as! LocationSearchTable 
    resultSearchController = UISearchController(searchResultsController: locationSearchTable) 
    resultSearchController?.searchResultsUpdater = locationSearchTable 
    // 
    let searchBar = resultSearchController!.searchBar 
    searchBar.sizeToFit() 
    searchBar.placeholder = "Search for places" 
    navigationItem.titleView = resultSearchController?.searchBar 
    // 
    resultSearchController?.hidesNavigationBarDuringPresentation = false 
    resultSearchController?.dimsBackgroundDuringPresentation = true 
    definesPresentationContext = true 
    // 
    locationSearchTable.mapView = mapView 
    // 
    locationSearchTable.handleMapSearchDelegate = self 
    // 
    let button = UIButton(type: UIButtonType.System) as UIButton 
    button.frame = CGRectMake(100, 100, 100, 50) 
    button.backgroundColor = UIColor.greenColor() 
    button.setTitle("Button", forState: UIControlState.Normal) 
    button.addTarget(self, action: Selector("Action:"), forControlEvents: UIControlEvents.TouchUpInside) 
    self.view.addSubview(button) 

} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 



} 

extension ViewController : CLLocationManagerDelegate { 
func locationManager(manager: CLLocationManager, didChangeAuthorizationStatus status: CLAuthorizationStatus) { 
    if status == .AuthorizedWhenInUse { 
     locationManager.requestLocation() 
    } 
} 

func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
    if let location = locations.first { 
     let span = MKCoordinateSpanMake(0.05, 0.05) 
     let region = MKCoordinateRegion(center: location.coordinate, span: span) 
     mapView.setRegion(region, animated: true) 
    } 
} 
func locationManager(manager: CLLocationManager, didFailWithError error: NSError) { 
    print("error:: \(error)") 
} 
} 

extension ViewController: HandleMapSearch { 
func dropPinZoomIn(placemark:MKPlacemark){ 
    // cache the pin 
    selectedPin = placemark 
    // clear existing pins 
    mapView.removeAnnotations(mapView.annotations) 
    let annotation = MKPointAnnotation() 
    annotation.coordinate = placemark.coordinate 
    annotation.title = placemark.name 
    if let city = placemark.locality, 
     let state = placemark.administrativeArea { 
     annotation.subtitle = "\(city) \(state)" 
    } 
    mapView.addAnnotation(annotation) 
    let span = MKCoordinateSpanMake(0.05, 0.05) 
    let region = MKCoordinateRegionMake(placemark.coordinate, span) 
    mapView.setRegion(region, animated: true) 

} 
} 
extension ViewController : MKMapViewDelegate { 

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

    if annotation is MKUserLocation { 
     //return nil so map view draws "blue dot" for standard user location 
     return nil 
    } 

    let reuseId = "pin" 
    var pinView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId) as? MKPinAnnotationView 
    pinView = MKPinAnnotationView(annotation: annotation, reuseIdentifier: reuseId) 
    pinView?.pinTintColor = UIColor.orangeColor() 
    pinView?.canShowCallout = true 
    pinView?.rightCalloutAccessoryView = UIButton(type: UIButtonType.DetailDisclosure) as UIButton 
    return pinView 
} 
func mapView(mapView: MKMapView, annotationView: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { 

    if control == annotationView.rightCalloutAccessoryView { 
     print("Disclosure Pressed!") 
    } 
} 



} 

Antwort

1

Sie können mit diesem Code versuchen:

if let detailVC = self.storyboard?.instantiateViewControllerWithIdentifier("yourVCIdentifier") as? YourDestinationController{ self.navigationController?.pushViewController(detailVC, animated: true) }

-1

Haben Sie versucht, so etwas wie: (vergessen Sie nicht die storyboardID Ihrer Viewcontroller im Storyboard hinzufügen)

if let yourVC = self.storyboard?.instantiateViewControllerWithIdentifier("YourViewController") as? YourViewController { 

// set the attributes of your VC here, like the coordinates that you want to display on your next VC 
yourVC.coordinatesForMap = yourCoordinates 
// etc 

self.navigationController?.pushViewController(yourVC, animated: true) 
}