0

Знаю, что эта ошибка обсуждалась уже сто раз, сам перечитал много вопросов по этой проблеме, даже этот, но мне это не помогло. Вообщем проблема:

Получаю 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 создавал, не кодом.

Razorik
  • 51
  • на строку выше сделайте print(mapView) посмотрите не пустой ли ваш mapView – Max Mikheyenko Nov 29 '16 at 19:18
  • @MaxMikheyenko спасибо за ответ, проапдейтил вопрос – Razorik Nov 29 '16 at 19:27
  • ну вот, почему unexpectedly found nil разобрались. теперь надо смотреть весь lifecycle вашего mapView чтоб понять где он пропадает – Max Mikheyenko Nov 29 '16 at 19:36
  • @MaxMikheyenko mapView пропадает когда я в другом ViewController инициализирую ViewController в котором находится этот mapView. Как тогда мне из Контрола1 вызвать функцию которая в Контроле2 находится? – Razorik Nov 29 '16 at 20:38
  • то есть вы создаете mapView в контроллер1 и потом передаете в контроллер2? – Max Mikheyenko Nov 29 '16 at 20:39
  • @MaxMikheyenko наоборот, в контроллере1 я создаю мапВью и функцию, затем в контроллере2 отлавливаю экшн и по данному экшну пытаюсь вызвать функцию в контроллере1 и мапВью пропадает – Razorik Nov 29 '16 at 20:43
  • показывайте код - как создаете и как вызываете – Max Mikheyenko Nov 29 '16 at 20:44
  • @MaxMikheyenko , проапдейтил вопрос – Razorik Nov 29 '16 at 20:50
  • посмотрите есть ли что то в mapView сразу после создания контроллера. Предположу, что контроллер не на экране, в связи с этим аутлеты из стриборда не созданы – Max Mikheyenko Nov 29 '16 at 20:52
  • @MaxMikheyenko при запуске приложения mapView загружается, карта отображается, пока не вызвать этот экшн. Если сделать print(mapView) до экшн то выводит: <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
  • то есть у первого контроллера есть self.mapView и у второго тоже? – Max Mikheyenko Nov 29 '16 at 21:00
  • @maxmikheyenko нет, у второго нет, второй контрол это меню - UITableViewController – Razorik Nov 29 '16 at 21:01
  • то есть у первого есть self.mapView , а второй умеет делать self.addPin() – Max Mikheyenko Nov 29 '16 at 21:02
  • @MaxMikheyenko у первого self.mapView, первый умеет self.addPin и self.getOrganizationFromRubricID, а второй умеет отлавливать экшн и нужно научить вызывать функцию getOrganizationFromRubricID которая в первом контроле. – Razorik Nov 29 '16 at 21:06
  • какая вероятность того, что было создано 2 инстанса первого контроллера? – Max Mikheyenko Nov 29 '16 at 21:08
  • @MaxMikheyenko ну на момент запуска я сомневаюсь что создается два, ну по крайней мере не вижу на это причин. А вот когда во втором контроле срабатывает экшн как раз таки создается еще один экземпляр. – Razorik Nov 29 '16 at 21:11
  • то есть, второй обращается к вновь созданному, который на этот момент не на экране? что приводит нас к моему комментарию выше, что у него аутлеты из сториборда не созданы – Max Mikheyenko Nov 29 '16 at 21:12
  • @MaxMikheyenko а как в таком случае реализовать вызов функции первого контрола во втором? Может подскажете хотя бы направление в котором гуглить? – Razorik Nov 29 '16 at 21:15
  • вам надо во втором иметь референс к первому. а не создавать 1.1 . не знаю точно как они у вас создаются, но обычно это довольно таки тривиальная задача – Max Mikheyenko Nov 29 '16 at 21:21

0 Answers0