Знаю, что эта ошибка обсуждалась уже сто раз, сам перечитал много вопросов по этой проблеме, даже этот, но мне это не помогло. Вообщем проблема:
Получаю JSON и отправляю их в функцию:
let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! Dictionary<String, AnyObject>
let name = parsedData["name"] as! String
let latit = Double(parsedData["latit"] as! String)
let longit = Double(parsedData["longit"] as! String)
self.addPin(name: name, latit: latit!, longit: longit!)
Получаю их в этой функции:
func addPin(name: String, latit: Double, longit: Double) {
let coord = CLLocationCoordinate2DMake(latit,longit)
let pin = MGLPointAnnotation()
pin.coordinate = coord
pin.title = name
mapView.addAnnotation(pin)
}
И при запуске получаю ошибку на этой строчке:
mapView.addAnnotation(pin)
Ума не приложу откуда может взяться nil. Данные которые функция получает проверял, они не nil. Переменные coord и pin тоже инициализируются нормально. Вызываю функцию загрузки JSON из другого ViewController'а, может ли быть такое, что это как то с этим связанно?
Если это важно - использую не стандартный MapView, а MapBox
UPD:
После комментария сначало подумал что может проблема из-за того что не указал self.mapView, но выполнив такой код:
func addPin(name: String, latit: Double, longit: Double) {
let coord = CLLocationCoordinate2DMake(latit,longit)
let pin = MGLPointAnnotation()
pin.coordinate = coord
pin.title = name
print(self.mapView ?? "Пустой")
self.mapView.addAnnotation(pin)
}
Получаю сообщение "Пустой". Может ли mapView стать пустым из-за того, что я класс с mapView в другом контроллере проинициализировал для использования некоторых функций вот так:
let h = Hello()
Это экшн в котором инициализирую контрол1 из которого пытаюсь вызвать функцию:
@IBAction func typeButtonTouchedUpInside(_ sender: UIButton) {
print(sender.currentTitle ?? "Nil")
let h = Hello()
if(sender.currentTitle=="1") {
h.getOrganizationFromRubricID(id: 0)
}
else if(sender.currentTitle=="2") {
h.getOrganizationFromRubricID(id: 1)
}
else if(sender.currentTitle=="3") {
h.getOrganizationFromRubricID(id: 2)
}
}
Функция которую вызываю:
public func getOrganizationFromRubricID(id: Int) {
let urlString = "http://192.168.1.10/api/?getOrganizationsFromRubricID/id=\(id)"
let url = URL(string:urlString)
URLSession.shared.dataTask(with:url!) { (data, response, error) in
if error != nil {
print(error ?? "Something wrong")
} else {
do {
self.removePins()
let parsedData = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [Dictionary<String, AnyObject>]
var i = 0
while i<parsedData.count {
let name = parsedData[i]["name"] as! String
let latit = Double(parsedData[i]["latit"] as! String)
let longit = Double(parsedData[i]["longit"] as! String)
self.addPin(name: name, latit: latit!, longit: longit!)
i += 1
}
} catch let error as NSError {
print(error)
}
}
}.resume()
}
А сам mapView через Storyboard создавал, не кодом.
<MGLMapView: 0x7ff2ebf123f0; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = LM+W+RM+TM+H+BM; gestureRecognizers = <NSArray: 0x61000004bc10>; layer = <CALayer: 0x610000234f40>>Контрол с картой всегда на экране, второй контрол - выдвижное меню слева – Razorik Nov 29 '16 at 20:58