Swift: iOS - передача данных из ViewController в xib-файл через 3-й класс - PullRequest
0 голосов
/ 22 сентября 2018

У меня довольно специфическая проблема, и я надеюсь, что кто-то может помочь мне с этим.У меня есть следующий файл, который на самом деле является просто файлом locationXIB, подключенным к xib, который я показываю как пользовательский MKAnnotation выноска:

class locationXIB: UIView {

    @IBOutlet weak var loationLabel: UILabel!
    @IBOutlet weak var oteviraciDobaLabel: UILabel!
    @IBOutlet weak var prijmajiKartyLabel: UILabel!
    @IBOutlet weak var souradniceLabel: UILabel!
    var customAnnotationsArray = [VecerkaAnnotation]()

    override func awakeFromNib() {
        super.awakeFromNib()
    }

 }

Второй класс, играющий роль в этом сценарииэто класс с именем VecerkaAnnotation, который является самой аннотацией:

import Foundation
import MapKit

class VecerkaAnnotation: NSObject, MKAnnotation {

    var myCoordinate: CLLocationCoordinate2D
    var prijmajiKarty = true
    var vsedniOteviraciDoba = ""
    var vikendovaOteviraceDobra = ""

    init(myCoordinate: CLLocationCoordinate2D){
        self.myCoordinate = myCoordinate
    }

    var coordinate: CLLocationCoordinate2D {
        return myCoordinate
    }

}

Третий класс (для простоты) - это мой MapViewController, здесь блок кода, который выбирает документы из Google Firestore и создает массивтипа [VecerkaAnnotation]:

class MapViewController: UIViewController, MKMapViewDelegate, CLLocationManagerDelegate {

    var customAnnotationsArray = [VecerkaAnnotation]()
        :
        :

func fetchDocuments() {
    let vecerkyRef = db.collection("vecerkyInfo")
    Prog.start(in: mapView, .blur(.dark), .activityIndicator)
    vecerkyRef.getDocuments { (querySnapshot, err) in
        Prog.dismiss(in: self.mapView)
        if let err = err {
            print("Error fetching data from Firestore: \(err)")
            let alert = UIAlertController(title: "Error fetching data", message: "Data could not be fetched, make sure you're connected to the Internet", preferredStyle: .alert)
            let action = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
            alert.addAction(action)
            self.present(alert, animated: true)
        } else {
            for document in querySnapshot!.documents {
                if let coords = document.get("geopoint"), let vsedni = document.get("vsedni"), let vikend = document.get("vikend"), let prijmajKarty = document.get("karty"){
                    let point = coords as! GeoPoint
                    let lat = point.latitude
                    let lon = point.longitude
                    let coord = CLLocationCoordinate2D(latitude: lat, longitude: lon)
                    let newAnnotation = VecerkaAnnotation(myCoordinate: coord)
                    newAnnotation.vikendovaOteviraceDobra = vikend as! String
                    newAnnotation.vsedniOteviraciDoba = vsedni as! String
                    newAnnotation.prijmajiKarty = prijmajKarty as! Bool
                    self.customAnnotationsArray.append(newAnnotation)
                }
                self.createAnnotations()
            }
            self.setLocation()
        }
    }
}

Четвертый и последний класс - это класс, отвечающий за управление MKAnnotationView

class LocationInformationAnnotationView: MKAnnotationView {
    weak var customCalloutView : locationXIB?
    :
    :

func loadLocationInformationCalloutView() -> locationXIB? {
    if let views = Bundle.main.loadNibNamed("locationXIB", owner: self, options: nil) as? [locationXIB], views.count > 0 {
        let locationInformationCalloutView = views.first!
        return locationInformationCalloutView
    }
    return nil
}

    override func setSelected(_ selected: Bool, animated: Bool) {
    if selected {
        self.customCalloutView?.removeFromSuperview()
        if let newCustomCalloutView = loadLocationInformationCalloutView() {
            newCustomCalloutView.frame.origin.x -= newCustomCalloutView.frame.width / 2.0 - (self.frame.width / 2.0)
            newCustomCalloutView.frame.origin.y -= newCustomCalloutView.frame.height
            self.addSubview(newCustomCalloutView)
            self.customCalloutView = newCustomCalloutView
            if animated {
                self.customCalloutView!.alpha = 0.0
                UIView.animate(withDuration: 0.5, animations: {
                    self.customCalloutView!.alpha = 0.9
                    self.customCalloutView!.layer.shadowColor = UIColor.black.cgColor
                    self.customCalloutView!.layer.shadowOffset = CGSize(width: 0, height: 5)
                    self.customCalloutView!.layer.shadowRadius = 8
                    self.customCalloutView!.layer.shadowOpacity = 0.2
                    self.customCalloutView!.layer.cornerRadius = 5
                })
            }
        }
    } else {
        if customCalloutView != nil {
            if animated {
                UIView.animate(withDuration: 0.5, animations: {
                    self.customCalloutView!.alpha = 0.0
                }, completion: { (success) in
                    self.customCalloutView!.removeFromSuperview()
                })
            } else { self.customCalloutView!.removeFromSuperview() }
        }
    }
}

То, чего я пытаюсь достичь, - это иметьметки в locationXIB заполнены свойствами VecerkaAnnotation, которые были получены из Google Firestore.Я уже пробовал много способов, и я в отчаянии.Любая помощь приветствуется, спасибо!.

1 Ответ

0 голосов
/ 22 сентября 2018

На данный момент я пропустил данные через глобальную переменную и в будущем буду использовать Realm для сохранения и извлечения данных.

Если у кого-то есть какие-либо другие решения, пожалуйста, не стесняйтесь поделиться.

...