Переменные IBOutlet возвращают ноль, когда я пытаюсь получить к ним доступ.Ошибка: Поток 1: Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть UIViewController, который реализует MGLMapViewDelegate.Я пытаюсь разместить навигационную панель вверху с двумя кнопками.

Мне не удалось увидеть мои кнопки или навигационную панель, поэтому я попытался использовать функцию view.bringSubviewToFront() в моем viewDidLoadFunction(), как это предлагается в этом сообщении

Когда ясделал это, я получил ошибку

Ошибка: поток 1: фатальная ошибка: неожиданно обнаружил ноль при развертывании Необязательное значение

Я не понимаю, как IBOutlet переменные могут быть нулевыми, я думал, что они были назначены кнопкам раскадровки


Мой класс ViewController (по крайней мере те части, которые я считаю важными)

class ViewController: UIViewController, MGLMapViewDelegate {

...

var mapView: MGLMapView?
@IBOutlet var navBar: UINavigationBar!
@IBOutlet var signOutButton: UIButton!
@IBOutlet var newPostButton: UIButton!

...

override func viewDidLoad() {
            super.viewDidLoad()

    self.mapView = MGLMapView(frame: view.bounds, styleURL: MGLStyle.lightStyleURL)

    ...

        view.addSubview(self.mapView!)

        view.addSubview(navBar)
        view.addSubview(signOutButton)
        view.addSubview(newPostButton)
        //Make the navBar and Buttons visible
        view.bringSubviewToFront(self.navBar)
        view.bringSubviewToFront(self.signOutButton)
        view.bringSubviewToFront(self.newPostButton)

        ...
}

...

@objc func handleLogout() {
     let loginController = SignInViewController()

     do {
          try Auth.auth().signOut()
      } catch let logoutError {
          print(logoutError)
      }

      present(loginController, animated: true, completion: nil)
  }
}

Некоторые скриншоты моей раскадровки, которые я считаю важными

enter image description here enter image description here enter image description here enter image description here enter image description here

Я пытался разместить это в моем контроллере представления сразу после super.viewDidLoad ()

self.storyboard?.instantiateViewController(withIdentifier: "mainViewController") as! ViewController

Я пытался перенести вид на передний план карты вместо основного вида

self.mapView.bringViewToFront(navBar)

Я пытался разместитькод внутри функций, таких как awakeFromNib и viewDidLayoutSubviews

    override func awakeFromNib() {
        super.awakeFromNib()

        //Make the navBar and Buttons visible
        self.mapView!.bringSubviewToFront(self.navBar)
        self.mapView!.bringSubviewToFront(self.signOutButton)
        self.mapView!.bringSubviewToFront(self.newPostButton)

    }

1 Ответ

3 голосов
/ 05 апреля 2019

Из ваших комментариев я понял, что вы неправильно создаете экземпляр контроллера.

let mainController = ViewController(). // Wrong

Это просто создаст экземпляр ViewController, но не каких-либо объектов из раскадровки.

Используйте приведенный ниже код для создания экземпляра viewcontroller из раскадровки.

    if let vc = self.storyboard?.instantiateViewController(withIdentifier: "mainViewController") as? ViewController {
        //Set any data if required, then present
        self.present(vc, animated: true, completion: nil)
    }

Если вы используете несколько storyBoards,

 let storyboard = UIStoryboard(name: "Main", bundle: nil)
 if let vc = storyboard.instantiateViewController(withIdentifier: "mainViewController") as? ViewController {
        self.present(vc, animated: true, completion: nil)
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...