如何通过Segue将变量从子类传递到SecondViewController [英] How to Pass Variables from a Subclass via a Segue to a SecondViewController

查看:72
本文介绍了如何通过Segue将变量从子类传递到SecondViewController的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个名为"Capital"的子类,它声明了变量,我想通过子类将这些变量通过子类推送到新的SecondViewController上

I have a subclass called "Capital" that declares variables and I would like to push these variables via the subclass to a new SecondViewController via a segue

除了子类"Capital"之外,我还具有(2)个ViewController:ViewController-> SecondViewController

In addition to the subclass "Capital" I also have (2) ViewControllers: ViewController -> SecondViewController

这是我的名为"Capital"子类的代码

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中,创建一个类型为Capital的全局变量.将值赋给calloutAccessoryControlTapped函数中的变量并执行segue.在SecondViewController中,创建一个类型为Capital的全局变量,并在prepare for segue

In first ViewController create a global variable with type Capital. Assign value tot the variable in calloutAccessoryControlTapped function and perform segue. In SecondViewController create a global variable with type Capital and pass value in 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)
    }
}

这篇关于如何通过Segue将变量从子类传递到SecondViewController的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆