IBOutlet是零,但它连接在故事板,斯威夫特

使用Swift 1.1和Xcode 6.2。

我有一个UIStoryboard包含一个单独的,自定义的UIViewController子类。 在它上面,我有一个从该控制器到故事板上的UIView 子类@IBOutlettypes的UIView连接。 我也有类似的观点。 见图A.

但在运行时,这些属性是零(图B)。 即使我确信我已经连接了Interface Builder中的sockets。

想法

  • 是否有可能是因为我正在使用一个子类的子类的东西混乱的初始化? 我并不是压倒任何初始者
  • awakeFromNib:由于某种原因没有被调用
  • 也许它不会连接到子视图上的子视图

我已经尝试过的事情:

  • 完全匹配@IBOutlet和storyboard项目types(而不是UIView
  • 删除财产和出路,并重新添加

图A

图A *

图B

图B

* Figure A隐藏的代码是:

 @IBOutlet private var annotationOptionsView: UIView! @IBOutlet private var arrivingLeavingSwitch: UISegmentedControl! 

谢谢。

通常情况下,这是因为您的视图控制器尚未加载其视图层次结构。 一个视图控制器只在view消息发送时才加载其视图层次结构。 系统会在实际上将视图层次结构放置在屏幕上时执行此操作,而事件如prepareForSegue:sender:viewWillAppear:已经返回。

由于您的VC尚未加载视图层次结构,因此您的网点仍然无效。

您可以强制VC通过说self.view来加载它的视图层次结构。

您是否尝试过运行产品>清洁。 为我解决了一个非常类似的问题。

故事板没有认识到我添加到它的任何进一步的UI的东西。 在运行时,所有的引用都是零。 所以我清除了我的派生数据文件夹,然后这些连接再次工作。

你是从Storyboard还是NIB实例化视图控制器,还是通过初始化器直接实例化它?

如果您用初始化程序直接实例化您的课程,则不会连接网点。 界面生成器创build您的类的定制实例,并将这些实例编码为NIB和故事板进行重复解码,但它没有定义类本身。 如果这是你的问题,你只需要改变你创build你的控制器的代码,而不是使用UIStoryboard或UINib上的方法。

这发生在我的自定义集合视图单元格。 原来我不得不用registerNibreplaceregisterClassforReuseIdentifier方法。 这为我修好了。

您可以调用controller.view强制加载视图以初始化IBOutlets,然后您将能够分配值。

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) { if (segue.identifier == "identifier") { let controller = segue.destinationViewController as! YourController let _ = controller.view //force to load the view to initialize the IBOutlets controller.your_IBOutlet_property = xxx ... controller.delegate = self } } 

我最近遇到这个问题! 这是我的想法。 问题不在于你的故事板或任何链接问题。 这是关于如何启动您的ViewController。 尤其是当你使用Swift的时候(当你创build一个类文件的时候,编辑器几乎没有任何东西)

通过简单地使用超类的init()不能启动任何与故事板一起工作的东西。 所以你需要做的是改变ViewController的初始化。 通过let XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController通过let XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController let XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController这告诉程序去故事板findXXViewController并启动故事板中的所有IBOutlet

希望这个帮助〜GL

在我的情况,这是因为我重写了ViewController子类中的loadView方法,但忘记添加[super loadView]

 -(void)loadView { // blank } 

当你重载loadView方法时,你有责任启动你的子视图。 由于您重写了它,因此界面生成器的视图没有机会转换为cocoa对象,因此出口仍然为零。

如果你在你的视图控制器子类中实现了loadView,那么你就有责任从storyboard / xib中将UI元素加载到代码中。

或者只是打电话

 [super loadView]; 

以便超类有机会将storyboard / xib加载到代码中。

这发生在我身上,因为我不小心直接实例化我的视图控制器,而不是通过故事板实例化它。 如果您通过MyViewController()直接实例化,那么sockets将不会被连接。

对我来说,当我不小心将视图控制器的类声明为

 class XYZViewController: UINavigationController { } 

(即作为UINavigationController而不是UIViewController )。

Xcode没有拿起这个错误,类似乎build立罚款,并重写函数,如viewDidLoadviewWillAppear等都正常工作。 但是没有一个IBOutlet被连接。

将声明更改为

 class XYZViewController: UIViewController { } 

完全修复它。

其他情况:

你的sockets将不会被设置,直到视图控制器的视图被实例化,在你的情况下,可能发生在initWithNibName:bundle:-at之后不久,它们仍然是零。 你所做的任何涉及这些sockets的设置应该发生在你的视图控制器的-viewDidLoad方法中。

  1. select.h.m视图控制器文件
  2. 删除这些文件的引用
  3. 重新添加文件到你的项目树
  4. 打开故事板,最终重新构build项目

如果连接到文件所有者或视图,请检查您的IBOutlet连接。 可能会有错误。

对于Swift 3。

 func configureView() { let _ = self.view } 

对于我来说,我在一个本地化的故事板上有同样的错误,一个元素被添加到一些区域而不是另一个,所以当我切换到缺less的元素区域时,我对该元素有空的引用,我不得不删除(冗余)本地化该故事板使用https://stackoverflow.com/a/42256341/1356559

您需要首先加载视图层次结构,以便在故事板中实例化出口。 为此,您可以手动调用loadView或loadViewIfNeeded方法。

意外的是我用AVPlayerViewController而不是UIViewController分类我的视图控制器。 通过重播它到UIViewController东西恢复正常。 这应该有所帮助。

没有build立清洁(正常和充分),删除派生的数据文件夹和退出Xcode为我工作。

复制一个类(链接到一个xib)后,我有同样的问题,以重用与另一个viewcontroller类(链接到故事板)。 我忘了删除

 override var nibName 

 override var nibBundle 

方法。

删除后,我的网点开始工作。

对我来说,这是因为containerView是零。

这是我的代码与崩溃

 @IBOutlet private var containerView: UIView! // Connected to Storyboard override open func loadView() { containerView.addSubview(anotherView) } 

缺less的是调用super.loadView() 。 所以添加它解决了我的问题。

固定代码

 @IBOutlet private var containerView: UIView! override open func loadView() { super.loadView() containerView.addSubview(anotherView) } 

当我已经在定制单元格中定义标识符之后,我已经为定制单元格添加了注册(_:forCellReuseIdentifier :)时,我遇到了类似的问题。 在viewDidLoad()函数中有这个代码。 一旦我删除它,它工作正常。

我看到你使用ViewController ! 在ViewController类中,您必须使用-viewDidLoad而不是 -awakeFromNib-awakeFromNib用于UIView