如何通过Segue传递variables从一个子类到一个SecondViewController

我有一个名为“资本”,声明variables的子类,我想推动这些variables通过子类通过一个新的SecondViewController

除了“资本”的子类,我还有(2)ViewControllers:ViewController – > SecondViewController

这是我的代码为“资本”的子类

import MapKit import UIKit class Capital: NSObject, MKAnnotation { var title: String? var coordinate: CLLocationCoordinate2D var info: String var imageForAnnotationView: UIImage? { guard let title = title else { return nil } return UIImage(named: "\(title).png") } init(title: String, coordinate: CLLocationCoordinate2D, info: String) { self.title = title self.coordinate = coordinate self.info = info } } 

这是我的第一个ViewController的整个代码:

 import MapKit import UIKit class ViewController: UIViewController, MKMapViewDelegate { var capital:Capital! @IBOutlet var mapView: MKMapView! override func viewDidLoad() { super.viewDidLoad() let london = Capital(title: "London", coordinate: CLLocationCoordinate2D(latitude: 51.507222, longitude: -0.1275), info: "Home to the 2012 Summer Olympics.") let oslo = Capital(title: "Oslo", coordinate: CLLocationCoordinate2D(latitude: 59.95, longitude: 10.75), info: "Founded over a thousand years ago.") let paris = Capital(title: "Paris", coordinate: CLLocationCoordinate2D(latitude: 48.8567, longitude: 2.3508), info: "Often called the City of Light.") let rome = Capital(title: "Rome", coordinate: CLLocationCoordinate2D(latitude: 41.9, longitude: 12.5), info: "Has a whole country inside it.") let washington = Capital(title: "Washington DC", coordinate: CLLocationCoordinate2D(latitude: 38.895111, longitude: -77.036667), info: "Named after George himself.") mapView.addAnnotations([london, oslo, paris, rome, washington]) } func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? { let identifier = "Capital" guard let annotation = annotation as? Capital else { return nil } let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) ?? MKPinAnnotationView(annotation:annotation, reuseIdentifier:identifier) annotationView.annotation = annotation annotationView.isEnabled = true annotationView.canShowCallout = true annotationView.rightCalloutAccessoryView = UIButton(type: .detailDisclosure) // set the image to the annotation view annotationView.image = annotation.imageForAnnotationView return annotationView 

//附加代码

 } func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { // let capital = view.annotation as! Capital // let placeName = capital.title // let placeInfo = capital.info self.capital = view.annotation as! Capital let SecondViewController = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") self.show(SecondViewController!, sender: nil) } } 

这是我的代码为SecondViewController

 import UIKit class SecondViewController: UIViewController { @IBOutlet weak var text1: UILabel! @IBOutlet weak var text2: UILabel! @IBOutlet weak var text3: UILabel! var selectedCapital:Capital! var myString = String() var placeName = String() var placeInfo = String() override func viewDidLoad() { super.viewDidLoad() text1.text = myString text2.text = placeName text3.text = placeInfo print(self.selectedCapital) }} 

谢谢你的帮助

在第一个ViewController中创build一个types为Capital的全局variables。 将值赋给calloutAccessoryControlTapped函数中的variables并执行segue。 在SecondViewController中创build一个types为Capital的全局variables,并在prepare for segue传递值

第一视图控制器

 class ViewController: UIViewController { var capital:Capital! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let secViewController = segue.destination as! SecondViewController // push the title, info and other optional variables secViewController.selectedCapital = self.capital } func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) { self.capital = view.annotation as! Capital performSegue(withIdentifier: "toSecViewControlle", sender: self) } } 

第二个ViewController

 class SecondViewController: UIViewController { var selectedCapital:Capital! override func viewDidLoad() { super.viewDidLoad() print(self.selectedCapital) } }