当以编程方式呈现包含视图控制器时,IBOutlet References 发现为 nil
IBOutlet References found nil when containing view controller is presented programmatically
我正在构建一个 运行ning 应用程序,并试图在点击开始 运行 按钮时以编程方式呈现视图控制器。但是,当我在设置呈现视图控制器后点击按钮时,在按调用顺序展开时发现对 IBOutlet 的任何引用都是 nil。
值得注意的是,当我通过故事板将两个视图控制器与“显示”连接时,一切正常,但我想以编程方式和全屏显示视图控制器,而不是默认情况下的卡片式显示。
来自呈现视图控制器:
@IBAction func startRunTapped(_ sender: Any) {
let inRunVC = CurrentRunVC()
inRunVC.modalPresentationStyle = .fullScreen
self.present(inRunVC, animated: true, completion: nil)
}
来自呈现的视图控制器:
import UIKit
import MapKit
class CurrentRunVC: LocationVC {
@IBOutlet weak var sliderImageView: UIImageView!
@IBOutlet weak var swipeBGImageView: UIImageView!
@IBOutlet weak var durationLabel: UILabel!
@IBOutlet weak var paceLabel: UILabel!
@IBOutlet weak var distanceLabel: UILabel!
@IBOutlet weak var pauseButton: UIButton!
var startLocation: CLLocation!
var lastLocation: CLLocation!
var timer = Timer()
var runDistance = 0.0
var pace = 0
var counter = 0
override func viewDidLoad() {
super.viewDidLoad()
let swipeGesture = UIPanGestureRecognizer(target: self, action: #selector(endRunSwiped(sender:)))
sliderImageView.addGestureRecognizer(swipeGesture) //error unwrapping here
sliderImageView.isUserInteractionEnabled = true // and here
swipeGesture.delegate = self as? UIGestureRecognizerDelegate
}
//errors also on any other reference to an IBOutlet
我已确认所有 IBOutlet 都已正确连接。
故事板:
提前致谢
您的视图控制器的插座在故事板中定义,并在从故事板加载视图控制器时创建。当你在这一行中初始化一个新的视图控制器时:
let inRunVC = CurrentRunVC()
然后系统将查找与视图控制器同名的 xib 文件,该文件不存在,这意味着它只是加载一个没有连接插座的空白视图。所有那些隐式解包的可选值现在都是零。
从按钮到同一个视图控制器创建一个新的 segue,但是模态表示,或者在情节提要中添加对呈现的视图控制器的引用,然后使用当前情节提要的带有标识符的实例化方法加载它.
您没有获取 CurrentVC
的正确情节提要实例,而是创建了一个新的情节提要实例。使用
而不是 let inRunVC = CurrentRunVC()
let runVC = self.storyboard?.instantiateViewController(withIdentifier: "CurrentRunVC") as! CurrentRunVC //set the identifier in the storyboard identity inspector
我正在构建一个 运行ning 应用程序,并试图在点击开始 运行 按钮时以编程方式呈现视图控制器。但是,当我在设置呈现视图控制器后点击按钮时,在按调用顺序展开时发现对 IBOutlet 的任何引用都是 nil。
值得注意的是,当我通过故事板将两个视图控制器与“显示”连接时,一切正常,但我想以编程方式和全屏显示视图控制器,而不是默认情况下的卡片式显示。
来自呈现视图控制器:
@IBAction func startRunTapped(_ sender: Any) {
let inRunVC = CurrentRunVC()
inRunVC.modalPresentationStyle = .fullScreen
self.present(inRunVC, animated: true, completion: nil)
}
来自呈现的视图控制器:
import UIKit
import MapKit
class CurrentRunVC: LocationVC {
@IBOutlet weak var sliderImageView: UIImageView!
@IBOutlet weak var swipeBGImageView: UIImageView!
@IBOutlet weak var durationLabel: UILabel!
@IBOutlet weak var paceLabel: UILabel!
@IBOutlet weak var distanceLabel: UILabel!
@IBOutlet weak var pauseButton: UIButton!
var startLocation: CLLocation!
var lastLocation: CLLocation!
var timer = Timer()
var runDistance = 0.0
var pace = 0
var counter = 0
override func viewDidLoad() {
super.viewDidLoad()
let swipeGesture = UIPanGestureRecognizer(target: self, action: #selector(endRunSwiped(sender:)))
sliderImageView.addGestureRecognizer(swipeGesture) //error unwrapping here
sliderImageView.isUserInteractionEnabled = true // and here
swipeGesture.delegate = self as? UIGestureRecognizerDelegate
}
//errors also on any other reference to an IBOutlet
我已确认所有 IBOutlet 都已正确连接。
故事板:
提前致谢
您的视图控制器的插座在故事板中定义,并在从故事板加载视图控制器时创建。当你在这一行中初始化一个新的视图控制器时:
let inRunVC = CurrentRunVC()
然后系统将查找与视图控制器同名的 xib 文件,该文件不存在,这意味着它只是加载一个没有连接插座的空白视图。所有那些隐式解包的可选值现在都是零。
从按钮到同一个视图控制器创建一个新的 segue,但是模态表示,或者在情节提要中添加对呈现的视图控制器的引用,然后使用当前情节提要的带有标识符的实例化方法加载它.
您没有获取 CurrentVC
的正确情节提要实例,而是创建了一个新的情节提要实例。使用
let inRunVC = CurrentRunVC()
let runVC = self.storyboard?.instantiateViewController(withIdentifier: "CurrentRunVC") as! CurrentRunVC //set the identifier in the storyboard identity inspector