【问题标题】:How can I open a View Controller programmatically from a button with Swift 2?如何使用 Swift 2 以编程方式从按钮打开视图控制器?
【发布时间】:2016-08-19 16:47:40
【问题描述】:

我想在 func mapView 中将 pin 中的按钮连接到另一个 View Controller,而不是打印(“Disclosure Pressed”)。当您点击按钮时,它会显示一个新的 View Controller,其中包含部分地图和更多内容。

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!")
    }
}



}

【问题讨论】:

    标签: swift button mapkit viewcontroller


    【解决方案1】:

    你可以试试这段代码:

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

    【讨论】:

      【解决方案2】:

      您是否尝试过类似的方法:(不要忘记在情节提要中添加您的 viewController 的 storyboardID)

      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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 2015-08-24
        • 2017-01-13
        • 1970-01-01
        • 1970-01-01
        • 2013-04-14
        • 1970-01-01
        相关资源
        最近更新 更多