Swift:iOS - 通过第三类将数据从 ViewController 传递到 xib 文件

Posted

技术标签:

【中文标题】Swift:iOS - 通过第三类将数据从 ViewController 传递到 xib 文件【英文标题】:Swift: iOS - Passing data from ViewController to a xib file trough 3rd class 【发布时间】:2018-09-22 09:00:11 【问题描述】:

我有一个非常具体的问题,我希望有人可以帮助我解决这个问题。我有以下文件,实际上只是一个文件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 中的标签由从 Google Firestore 检索到的VecerkaAnnotation 的属性填充。我已经尝试了很多方法并且很绝望。任何和所有的帮助表示赞赏,谢谢! .

【问题讨论】:

【参考方案1】:

目前我已经通过全局变量传递数据,未来将使用 Realm 来保存和检索数据。

如果有人有其他解决方案,请随时分享。

【讨论】:

以上是关于Swift:iOS - 通过第三类将数据从 ViewController 传递到 xib 文件的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 通过动画将搜索栏从中心移动到导航栏下方(Swift)

iOS如何获取下一行解析Swift

将数据从 Firestore 映射到 Swift 中的结构 - IOS

IOS Swift:如何在两个控制器之间传输数据

如何从firebase数据库中检索url并通过UIButton(SWIFT)显示url?

IOS Swift TableView:有没有办法将第一个单元格向下移动一行