当我尝试访问IBOutlet变量时,它们返回nil。错误:Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
当我尝试访问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)
}
问题的出现原因是在尝试访问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值时,可能是因为视图控制器的实例化方法不正确。通过正确地实例化视图控制器,可以解决此问题。如果使用多个故事板,需要注意调用正确的故事板来实例化视图控制器。