2016-11-03 3 views
0

Было много поисков без успеха. На мой взгляд, контроллер на viewDidLoad я вызываю функцию с именем callJson. Затем он устанавливает данные, привязанные к UITableView. Все это отлично работает в первый раз. Теперь у меня также есть UIRefreshControl, и когда я его вытаскиваю, он вызывает вызов к той же функции, callJson, и здесь, во второй попытке, я получаю позорную ошибкуSwift UIViewController tableView.reloadData nil wrapping при втором вызове

фатальная ошибка: неожиданно найден nil во время разворачивания опционально значение on self.tableView.reloadData()

Вот функция, которая делает запрос json и говорит, чтобы перезагрузить таблицу новыми данными.

func callJson(){ 
    JSONOperations.sharedInstance.JsonRequest(roadType: Helpers.RoadWayTypes.ALERTS, imageId: nil) {(json: NSDictionary) in 
     do { 
      //unbox alerts 
      let aData: Alerts = try unbox(dictionary: json as! UnboxableDictionary) 
      self.alerts = aData 
      self.tableView.reloadData() 
     } 
     catch { 
      print(error) 
     } 
    } 
} 

установка Tableview данных клеток

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if let alertD = alerts?.Alerts[indexPath.row] { 
     let cell = self.tableView.dequeueReusableCell(withIdentifier: "AlertTableViewCell") as! AlertTableViewCell 
     cell.name.text = alertD.Summary 
     cell.icon.image = Helpers.listImage24dp(id: alertD.TOA) 
     cell.selectionStyle = .none 
     if alertD.Url.characters.count == 0 { 
      cell.isUserInteractionEnabled = false 
      return cell 
     } 
     cell.isUserInteractionEnabled = true 
     cell.name.textColor = UIColor.blue 
     return cell 
    } 
    return UITableViewCell() 
} 

Когда я поставил точку останова только до self.tableView.reloadData() и ступить, он идет к выходу, определенной, но затем бросает нулевую ошибку , Я не уверен, нужно ли мне настраивать вещи по-другому в tableView или что-то еще, поскольку оно работает правильно в первый раз. Любая помощь/идеи, которые нужно попробовать, оценивают.

+0

Вы уверены, что используете розницу для настольного экрана? –

+0

Да, в противном случае это не сработало бы в первый раз, если по какой-то причине розетка не упала между первым вызовом и вторым, если бы я не понял, почему и как его восстановить. –

ответ

1

Пожалуйста, используйте нижеследующее.

DispatchQueue.main.async { 
    self.tableview.reloadData() 
} 

Причина: TableView перезарядка должно происходить в потоке пользовательского интерфейса.

+0

Внесение этого в закрытие ничего не изменило. Все еще работает первый раз, но не второй. Такая же ошибка. –

Смежные вопросы