当我尝试访问IBOutlet变量时,它们返回nil。错误:Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

11 浏览
0 Comments

当我尝试访问IBOutlet变量时,它们返回nil。错误:Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

我有一个实现了MGLMapViewDelegate的UIViewController。我想在顶部放置一个导航栏,并添加两个按钮。

我无法让我的按钮或导航栏显示出来,所以我尝试在viewDidLoadFunction()中使用view.bringSubviewToFront()函数,正如这个帖子上建议的那样。

但是,当我这样做时,我收到了错误消息:

错误:Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value

我不明白为什么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)

//使navBar和按钮可见

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)

}

}

一些我认为重要的故事板截图:

[截图1](https://i.stack.imgur.com/JHt4i.png)

[截图2](https://i.stack.imgur.com/nDy9m.png)

[截图3](https://i.stack.imgur.com/GDt7P.png)

[截图4](https://i.stack.imgur.com/Tg12G.png)

[截图5](https://i.stack.imgur.com/bNX2J.png)

我尝试将以下代码放在我的视图控制器中,就在super.viewDidLoad()之后:

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

我尝试将视图放在地图视图前面,而不是主视图:

self.mapView.bringViewToFront(navBar)

我尝试将代码放在awakeFromNib和viewDidLayoutSubviews等函数中:

override func awakeFromNib() {

super.awakeFromNib()

//使navBar和按钮可见

self.mapView!.bringSubviewToFront(self.navBar)

self.mapView!.bringSubviewToFront(self.signOutButton)

self.mapView!.bringSubviewToFront(self.newPostButton)

}

0
0 Comments

问题的出现原因是在尝试访问IBOutlet变量时,它们返回了nil值。错误信息是:Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value。

解决方法是正确地实例化视图控制器。如果使用故事板,可以使用以下代码来实例化视图控制器:

if let vc = self.storyboard?.instantiateViewController(withIdentifier: "mainViewController") as? ViewController {

//设置任何需要的数据,然后呈现视图控制器

self.present(vc, animated: true, completion: nil)

}

如果使用多个故事板,可以使用以下代码:

let storyboard = UIStoryboard(name: "Main", bundle: nil)

if let vc = storyboard.instantiateViewController(withIdentifier: "mainViewController") as? ViewController {

self.present(vc, animated: true, completion: nil)

}

需要注意的是,如果调用self.storyboard的类不是来自故事板,而是在代码中编写的视图控制器,可能会返回nil。在这种情况下,可以在故事板中创建一个视图控制器面板来解决这个问题。

此外,如果登录故事板场景跳转到主视图,并且还有其他视图控制器链接到主视图,可能会导致混淆。可以通过使用不同故事板的视图控制器来解决这个问题。

当访问IBOutlet变量时返回nil值时,可能是因为视图控制器的实例化方法不正确。通过正确地实例化视图控制器,可以解决此问题。如果使用多个故事板,需要注意调用正确的故事板来实例化视图控制器。

0