我制作的应用程序应该加载所有加油站及其价格。 如果用户选择不同类型的气体(麦格纳,高级和柴油),地图应重新加载价格。这是通过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)
}
}
}
答案 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()
}