重新加载地图注释时遇到麻烦

时间:2017-08-18 20:27:48

标签: ios swift mapkit

我制作的应用程序应该加载所有加油站及其价格。 如果用户选择不同类型的气体(麦格纳,高级和柴油),地图应重新加载价格。这是通过UISegment控件完成的。

问题在于,当我重新加载地图时,它没有打印正确的价格(默认值是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)
        }
    }
}

1 个答案:

答案 0 :(得分:0)

我认为您的问题在于ubicaciones vars,您有一个本地var和一个名称相同的实例var,您需要一直使用实例var而不是创建另一个var,您也会失败每次更改气体类型时,您的信息会反复进行,以便进行网络呼叫

尝试替换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()
    }