ios swift variables mkmapview viewcontroller

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:

  1. Agregar imagen a la anotación personalizada (ver código a continuación)
  2. 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 nuevo SecondViewController 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)
  3. Una vez que el usuario toca el botón de llamada en el pin personalizado, presionamos ViewController a un nuevo controlador de vista llamado SecondViewController y asignamos los valores de la subclase Capital que están adjuntos al pin personalizado que se tapó con las nuevas etiquetas y la vista del selector en SecondViewController

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