ios - Pasar variables a un nuevo controlador de vista a través de una subclase y Docenas de marcadores de mapa
swift mkmapview (1)
Parece que estás muy cerca. En calloutAccessoryControlTapped
, obtienes el nombre y la información del lugar. Supongo que eso es lo que quieres pasar al segundo controlador de vista, así que adelante y hazlo antes de show
:
func mapView(_ mapView: MKMapView, annotationView view: MKAnnotationView, calloutAccessoryControlTapped control: UIControl) {
let capital = view.annotation as! Capital
let placeName = capital.title
let placeInfo = capital.info
let secondViewController = sUIKeyInputUpArrowtoryboard!.instantiateViewController(withIdentifier: "SecondViewController") // I''m not sure why you''re not just doing `storyboard.instantiateViewController(...); do you really have multiple storyboards floating around?
secondViewController.placeName = placeName
secondViewController.placeInfo = placeInfo
show(secondViewController, sender: self)
}
Eso supone, por supuesto, que su segundo controlador de vista tiene esas propiedades placeName
y placeInfo
, por ejemplo
class SecondViewController {
var placeName: String!
var placeInfo: String!
override func viewDidLoad() {
// use placeName and placeInfo to populate UI controls as necessary
}
}
Confieso, sin embargo, que su pregunta tiene una tonelada de código no relacionado que es difícil de entender, por lo que no está claro exactamente lo que necesita hacer. Pero la idea es clara, que calloutAccessoryControlTapped
debería
- averiguar qué necesita pasar al siguiente controlador de vista;
- crear una instancia de ese controlador de vista;
- establecer las propiedades apropiadas en ese controlador de vista siguiente;
- entonces
show
; y - ese segundo controlador de vista debe usar cualquier propiedad que establezca en el controlador de vista anterior para configurar su UI.
Nota, calloutAccessoryControlTapped
en el primer controlador de vista no puede actualizar los controles de UI en el segundo controlador de vista directamente (ya que los controles para ese controlador de vista todavía no se han conectado a las salidas en el guión gráfico), sino que simplemente pasa los datos de esa segunda vista controlador necesita Entonces, ese segundo controlador de vista configurará sus controles en su viewDidLoad
.
Tengo algunas partes móviles en este que parece que no puedo unir, espero que sea bastante sencillo.
Las preguntas anteriores no usan una subclase y en este ejemplo podría haber docenas de pines personalizados en el mapa y cada pin pasa variables específicas a un nuevo ViewController
Tres objetivos:
- Agregar imagen a la anotación personalizada (ver código a continuación)
- Tengo una subclase llamada
Capital
, me gustaría agregar la imagen en el n. ° 1 y luego crear variables adicionales para mantener los valores que se pasarán a un nuevoSecondViewController
que incluye (2) etiquetas y una vista de selector: por ejemplo label1 = "text1 ", label2 =" text2 ", y luego tomar una cadena de una matriz que contiene múltiples objetos (es decir, el título de cada fila del selector) - Una vez que el usuario toca el botón de llamada en el pin personalizado, presionamos
ViewController
a un nuevo controlador de vista llamadoSecondViewController
y asignamos los valores de la subclaseCapital
que están adjuntos al pin personalizado que se tapó con las nuevas etiquetas y la vista del selector enSecondViewController
Aquí está mi código hasta ahora:
Subclase llamada 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
}
}
Aquí está mi código para 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
}
Aquí agregamos las variables de leyenda personalizadas que son específicas de la ciudad que se presionó y las SecondViewController
al 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)
}
Aquí está mi código para SecondViewController
import UIKit
class SecondViewController: 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"
// continued...
}
}
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
cityName = row
}
}
Apreciar cualquier ayuda