【问题标题】:IBOutlet References found nil when containing view controller is presented programmatically [duplicate]以编程方式呈现包含视图控制器时发现 IBOutlet 引用为零 [重复]
【发布时间】:2021-04-14 08:09:36
【问题描述】:

我正在构建一个正在运行的应用程序,并尝试在点击开始运行按钮时以编程方式呈现一个视图控制器。但是,当我在设置呈现视图控制器后点击按钮时,在按调用顺序展开时,发现对 IBOutlet 的任何引用都为零。

值得注意的是,当我通过情节提要将两个视图控制器与“显示”连接时,一切正常,但我想以编程方式全屏显示视图控制器,而不是默认情况下的卡片式演示。

从呈现视图控制器:

@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

我已确认所有 IBOutlets 均已正确连接。

故事板:

提前致谢

【问题讨论】:

  • 您没有初始化将其与其 Storyboard 版本连接起来的 ViewController。你需要使用UIStoryboard(name: "storyboardName", bundle: nil).instantiateViewControllerWithIdentifier("CurrentRunVC")作为! CurrentRunVC`
  • 但是使用 Storyboard,您可以选择“Present Modally”而不是“Show”,然后选择“Presentation”:“Full Screen”

标签: ios swift viewcontroller presentmodalviewcontroller presentviewcontroller


【解决方案1】:

您没有获取CurrentVC 的正确故事板实例,但您正在创建一个新实例。而不是let inRunVC = CurrentRunVC(),使用

let runVC = self.storyboard?.instantiateViewController(withIdentifier: "CurrentRunVC") as! CurrentRunVC //set the identifier in the storyboard identity inspector

【讨论】:

    【解决方案2】:

    您的视图控制器的出口在情节提要中定义,并在从情节提要加载视图控制器时创建。当你在这一行初始化一个新的视图控制器时:

    let inRunVC = CurrentRunVC()
    

    然后系统会寻找一个与视图控制器同名的 xib 文件,该文件不存在,这意味着它只是加载一个没有连接插座的空白视图。所有那些隐式展开的选项现在都为零。

    要么从按钮到同一个视图控制器创建一个新的 segue,但是一个模态演示,或者在情节提要中添加对呈现的视图控制器的引用,然后使用当前情节提要的 instatiate with identifier 方法加载它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-15
      • 2021-04-28
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多