ios - 重新加载 map 注释时出现问题

标签 ios swift mapkit

我正在制作一个应用程序,该应用程序应加载该州的所有加油站及其价格。 如果用户选择不同类型的汽油(Magna、Premium 和 Diesel), map 应重新加载价格。这是通过 UISegment 控件完成的。

问题是,当我重新加载 map 时,它不会打印正确的价格(默认价格是 magna,当我选择其他类型的气体时,它不会加载新价格)。

这是我的代码。

class MapViewController: UIViewController,MKMapViewDelegate, CLLocationManagerDelegate,UICollectionViewDelegate, UICollectionViewDataSource {
    let manager = CLLocationManager()
    public let sMAGNA = "magna"
    public let sPREMIUM = "premium"
    public let sDIESEL = "diesel"
    public let MIN_TIME: CLong = 400
    private let MIN_DISTANCE: Float = 1000
    private var ubicaciones_selected: [Ubicacion] = []
    private var ubicaciones_magna: [Ubicacion]  = []
    private var ubicaciones_premium: [Ubicacion] = []
    private var ubicaciones_diesel: [Ubicacion] = []
    private let REQUEST_LOCATION = 1
    private var latlon: String = ""
    private var mType: String = "magna"
    var ubicaciones:[Ubicacion] = []
    var Ubigaspin = MKPointAnnotation()

     @IBAction func MapType(_ sender: Any) {
        if mapa.mapType == MKMapType.standard{
            mapa.mapType = MKMapType.satellite
        } else {
            mapa.mapType = MKMapType.standard
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        self.mapa.delegate = self
        //con esto obtendremos la ubicacion del usuario
        manager.delegate = self
        manager.desiredAccuracy = kCLLocationAccuracyBest
        manager.requestWhenInUseAuthorization()
        mapa.showsUserLocation = true
        manager.startUpdatingLocation()

        //se cargan los pines y las gasolinas
        loadGas(tipo: mType)
    }

    func loadGas(tipo:String){
        mType = tipo
        var ubicaciones:[Ubicacion] = []
        switch tipo {
        case sMAGNA:
            ubicaciones = ubicaciones_magna
        case sPREMIUM:
            ubicaciones = ubicaciones_premium
        case sDIESEL:
            ubicaciones = ubicaciones_diesel
        default:
            ubicaciones = ubicaciones_magna
        }

        if ubicaciones.count == 0 {
            let url = URL(string: "http://192.241.214.56/api/"+tipo+"/?format=json")
            URLSession.shared.dataTask(with: url!, completionHandler: {
                (data, response, error) in
                if(error != nil){
                    print("error")
                }else{
                    do{
                        let ubicaciones_json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [[String : AnyObject]]

                        for ubicacion in ubicaciones_json{
                            let nombre:String = ubicacion["nombre"] as! String
                            let direccion:String = ubicacion["direccion"] as! String
                            let precio_magna:Float = ubicacion["precio_magna"] as! Float
                            let precio_premium:Float = ubicacion["precio_premium"] as! Float
                            let precio_diesel:Float = ubicacion["precio_diesel"] as! Float
                            let ubicacion:String = ubicacion["ubicacion"] as! String

                            let p = Ubicacion()
                            p.ubicacion = ubicacion
                            p.setLatLng()
                            p.nombre = nombre
                            p.direccion = direccion

                            p.precio_magna = precio_magna
                            p.precio_premium = precio_premium
                            p.precio_diesel = precio_diesel

                            ubicaciones.append(p)
                        }


                        self.ubicaciones = ubicaciones

                        OperationQueue.main.addOperation({
                            self.updatePins(ubicaciones: ubicaciones)
                        })

                    }catch let error as NSError{
                        print(error)
                    }
                }
            }).resume()
        }else{
            self.ubicaciones = ubicaciones
                 self.updatePins(ubicaciones: ubicaciones)
        }
    }
    func updatePins(ubicaciones:[Ubicacion]){
        mapa.removeAnnotations(mapa.annotations)

        for ubicacion in ubicaciones{

            let anno = CustonAnno(ubicacion:ubicacion, image: #imageLiteral(resourceName: "icon"))
            anno.coordinate = CLLocationCoordinate2D(latitude: ubicacion.latitude!, longitude: ubicacion.longitude!)
            anno.title=ubicacion.nombre
            //anno.subtitle="$\(ubicacion.getPrecio(tipo: mType))"
            self.mapa.addAnnotation(anno)
        }
    }

    @IBAction func changeSegment(_ sender: UISegmentedControl) {
        print(sender.selectedSegmentIndex)
        switch sender.selectedSegmentIndex {
        case 0:
            loadGas(tipo: sMAGNA)
        case 1:
            loadGas(tipo: sPREMIUM)
        case 2:
            loadGas(tipo: sDIESEL)
        default:
            loadGas(tipo: sMAGNA)
        }
    }
}

最佳答案

我认为你的问题出在你的 ubicaciones 变量上,你有一个本地变量和一个同名的实例变量,你需要一直使用你的实例变量而不是创建另一个,你还会一次又一次地丢失您的信息 每次您更改燃气类型时都需要进行网络调用

尝试替换您的loadGas 方法

由这个

func loadGas(tipo:String){
        mType = tipo
        switch tipo {
        case sMAGNA:
            if(ubicaciones_magna.count > 0){
                self.ubicaciones = ubicaciones_magna
                self.updatePins(ubicaciones: self.ubicaciones)
                return
            }
        case sPREMIUM:
            if(ubicaciones_premium.count > 0){
                self.ubicaciones = ubicaciones_premium
                self.updatePins(ubicaciones: self.ubicaciones)
                return
            }
        case sDIESEL:
            if(ubicaciones_diesel.count > 0){
                self.ubicaciones = ubicaciones_diesel
                self.updatePins(ubicaciones: self.ubicaciones)
                return
            }
        default:
            if(ubicaciones_magna.count > 0){
                self.ubicaciones = ubicaciones_magna
                self.updatePins(ubicaciones: self.ubicaciones)
                return
            }
        }

        let url = URL(string: "http://192.241.214.56/api/"+tipo+"/?format=json")
        URLSession.shared.dataTask(with: url!, completionHandler: {
            (data, response, error) in
            if(error != nil){
                print("error")
            }else{
                do{
                    let ubicaciones_json = try JSONSerialization.jsonObject(with: data!, options:.allowFragments) as! [[String : AnyObject]]

                    var newUbications:[Ubicacion] = []

                    for ubicacion in ubicaciones_json{
                        let nombre:String = ubicacion["nombre"] as! String
                        let direccion:String = ubicacion["direccion"] as! String
                        let precio_magna:Float = ubicacion["precio_magna"] as! Float
                        let precio_premium:Float = ubicacion["precio_premium"] as! Float
                        let precio_diesel:Float = ubicacion["precio_diesel"] as! Float
                        let ubicacion:String = ubicacion["ubicacion"] as! String

                        let p = Ubicacion()
                        p.ubicacion = ubicacion
                        p.setLatLng()
                        p.nombre = nombre
                        p.direccion = direccion

                        p.precio_magna = precio_magna
                        p.precio_premium = precio_premium
                        p.precio_diesel = precio_diesel

                        newUbications.append(p)
                    }

                    switch tipo {
                    case sMAGNA:
                            self.ubicaciones_magna = newUbications
                            self.ubicaciones = self.ubicaciones_magna
                    case sPREMIUM:
                            self.ubicaciones_premium = newUbications
                            self.ubicaciones = self.ubicaciones_premium
                    case sDIESEL:
                            self.ubicaciones_diesel = newUbications
                            self.ubicaciones = ubicaciones_diesel
                    default:
                        self.ubicaciones_magna = newUbications
                        self.ubicaciones = self.ubicaciones_magna
                    }


                    OperationQueue.main.addOperation({
                        self.updatePins(ubicaciones: self.ubicaciones)
                    })

                }catch let error as NSError{
                    print(error)
                }
            }
        }).resume()
    }

关于ios - 重新加载 map 注释时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45764609/

相关文章:

xcode - 在 Swift 中使用结构时如何简洁地定义模型对象?

ios - UITextField 中 Caret/Cursor 的奇怪行为

ios - Apple Watch 应用程序 : run an MKDirectionsRequest through the parent iOS app in the background?

objective-c - 尝试将 map 注释 View 上的详细信息披露指示器连接到 segue 方法

ios - NSInputStream 与 url 在 iOS 中出现 nil

ios - 使用 GL_POINTS 通过 OpenGL 改变线宽 (iOS)

ios - 减少中心屏幕 alpha 时出现 MMDrawerController 错误

iOS ARKit : Integrate AR feature in existing iOS Project

ios - Swift - Show Segue 的奇怪行为

ios - 带有 MapKit ios 的渐变折线