这是我的设置:ViewController - > SecondViewControoler
三个目标:
到目前为止,这是我的代码:
名为“Capital.swift”的子类
import MapKit
import UIKit
class Capital: NSObject, MKAnnotation {
var title: String?
var coordinate: CLLocationCoordinate2D
var info: String
// here we would add the custom image in Goal #1
// here we would add the (2) values for label1 and label2 in Goal #2
// here we would add the array that contains multiple object in Goal #2
init(title: String, coordinate: CLLocationCoordinate2D, info: String) {
self.title = title
self.coordinate = coordinate
self.info = info
// add additional lines as needed
}
}
这是我的ViewController.swift
的代码import MapKit
import UIKit
class ViewController: UIViewController, MKMapViewDelegate {
@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"
if annotation is Capital {
if let annotationView = mapView.dequeueReusableAnnotationView(withIdentifier: identifier) {
annotationView.annotation = annotation
return annotationView
} else {
let annotationView = MKPinAnnotationView(annotation:annotation, reuseIdentifier:identifier)
annotationView.isEnabled = true
annotationView.canShowCallout = true
let btn = UIButton(type: .detailDisclosure)
annotationView.rightCalloutAccessoryView = btn
//annotationView.image = UIImage(named: "#imageLiteral(resourceName: ",pin,")")
return annotationView
}
}
return nil
}
在这里,我们添加特定于已按下的城市的自定义标注变量,并将这些变量推送到SecondViewController
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
let capital = view.annotation as! Capital
let placeName = capital.title
let placeInfo = capital.info
//Add custom image + (2) labels + and the array that contains multiple objects to be passed to the Picker 'view in the SecondViewController
// Upon the User tapping the above button we push all the variables stored in Capital attached to the current city pin that was pressed to the new SecondViewController
// Send the View Controller to the SecondViewController programically
let SecondViewController = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController")
self.show(SecondViewController!, sender: nil)
}
}
这是我的SecondViewController代码
import UIKit
class ViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
@IBOutlet weak var pickerView: UIPickerView!
var cityName = 0
//the values here are pulled from the custom pin that was pressed in the previous ViewController
var Array = ["object1 from custom pin","object2 from custom pin,","object3 from custom pin"]
@IBOutlet weak var label1: UILabel!
@IBOutlet weak var label2: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
pickerView.delegate = self
pickerView.dataSource = self
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
return Array[row]
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return Array.count
}
func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
@IBAction func submit(_ sender: Any) {
if (cityName == 0){
label1.text = "object1 from custom pin"
}
else if(cityName == 1){
label1.text = "object2 from custom pin"
}
else{
label1.text = "object3 from custom pin"
续...
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
cityName = row
}
}
感谢任何帮助
答案 0 :(得分:3)
另一种选择是致电
"func performSegue(withIdentifier identifier: String, sender: Any?)"
将从ViewController触发segue SecondViewController。这就是你想在故事板中保持ViewControllers之间移动的代码,即你控制从ViewController拖到SecondViewController来创建一个segue并给它一个唯一的id。
每个UIViewController(子类)都继承了一个函数
"func prepare(for segue: UIStoryboardSegue, sender: Any?)"
将由系统调用,您可以在此处添加
实施以顾名思义准备以前需要的东西
执行特定的segue。这时候下一个
ViewController已从Storyboard加载到内存中(但是
没有开始显示)。和" segue" *参数
"prepare(for segue: UIStoryboardSegue, sender: Any?)"
实际上有一个
property " destination" 实际上是下一个ViewController。
小心但是,因为你可能有超过1个segue
ViewController到不同的下一个ViewController。
因此"segue.destination"
可能不是您想要的SecondViewController
你有超过1个segue设置。因为系统调用
每个"prepare(for segue: UIStoryboardSegue, sender: Any?)"
segue离开这个当前的ViewController。一定要检查
"segue.identifier"
以确保您的后续代码正在处理
你认为自己就是一样的。
现在你终于可以做你头条问题了。
使用指向SecondViewController的指针,您可以自由设置任何
它拥有的财产,这是您的资本的特定实例
宾语。要完整循环, "发件人" 参数
"performSegue(withIdentifier identifier: String, sender: Any?)"*
和
"prepare(for segue: UIStoryboardSegue, sender: Any?)"
实际上是
一样。所以你实际上可以传递你喜欢的任何对象/结构
" performSegue()" to"准备(for:)" 简单地将发件人对象转换为
确认" segue.identifier后通过的类型。"
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
let capital = view.annotation as! Capital
let placeName = capital.title
let placeInfo = capital.info
// Option 1
perform segue.performSegue(withIdentifier: "SegueToSecondID", sender: capital)
//Option 2 programmatically create SecondViewController and show.
let SecondViewController = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController")
SecondViewController.capital = capital
self.show(SecondViewController!, sender: nil)
}
// If you are doing option 1
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "SegueToSecondID" && sender is Capital {
let destination = segue.destination as SeconViewController
destination.capital = sender
}
}
class SecondViewController {
//........
var capital: Capital? //Up to you if you want this as an optional
}
答案 1 :(得分:1)
使用Rob的建议,但是将Capital
对象传递给发件人而不是视图,calloutAccessoryControlTapped可能如下所示:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
guard let capital = view.annotation as? Capital else { return }
performSegue(withIdentifier: "segue1", sender: capital)
}
func prepare(for segue: UIStoryboardSegue,
sender: Any?) {
guard let destination = segue.destination as? SecondViewController,
let capital = sender as? Capital else { return }
destination.capital = capital //Assuming SecondViewController has a capital property
}
答案 2 :(得分:0)
创建对要将数据传递到AKA目标类的类的引用
`let vc = self.storyboard!.instantiateViewController(withIdentifier: "Class Identifier") as! YourDestinationClass`
然后,您可以使用YourDestinationClass
vc
内的所有对象