IBOutlet是零,但它在故事板,Swift中连接

Ste*_*ich 96 null xcode iboutlet uistoryboard swift

使用Swift 1.1和Xcode 6.2.

我有一个UIStoryboard包含一个单一的自定义UIViewController子类.在它上面,我有一个从该控制器到故事板上的子类@IBOutlet的类型连接.对于该视图的子视图,我也有类似的出口.见图A.UIViewUIView

但在运行时,这些属性为零(图B).尽管我已经确定我已经在Interface Builder中连接了这些插座.

想法:

  • 是否有可能因为我使用子类的子类与初始化混淆了?我没有压倒任何初始化器
  • awakeFromNib: 由于某种原因没有被召唤
  • 也许它没有连接到子视图的子视图

我尝试过的事情:

  • @IBOutlet完全匹配和故事板项目类型(而不是UIView)
  • 删除属性和插座并重新添加它们

图A.

图A*

图B.

图B.

*模糊的代码Figure A是:

@IBOutlet private var annotationOptionsView: UIView!
@IBOutlet private var arrivingLeavingSwitch: UISegmentedControl!
Run Code Online (Sandbox Code Playgroud)

谢谢.

rob*_*off 136

通常发生这种情况是因为您的视图控制器尚未加载其视图层次结构.视图控制器仅在某些内容向其发送view消息时加载其视图层次结构.当实际将视图层次结构放在屏幕上时,系统会执行此操作,这在事情之后发生prepareForSegue:sender:并且viewWillAppear:已经返回.

由于您的VC尚未加载其视图层次结构,因此您的网点仍为零.

您可以通过说明强制VC加载其视图层次结构_ = self.view.

  • 好吧,如果你实例化一个viewcontroller:让vc = self.storyboard?.instantianteViewControllerWithIdentifier("StoryboardIDfromVC")为?CustomVC; 让view = vc.view; //现在,你可以在这里访问CustomVC的IBOutlets .. vc.customTextField.text ="Lalala"; 希望它能帮到你!:) (4认同)
  • 这是在我第一次使用该插座执行“ viewWillAppear:”时发生的。访问视图对我没有任何帮助。还是零。 (3认同)
  • UIViewcontroller.loadViewIfNeeded()是在此处使用的正确方法。 (3认同)

Tho*_*ief 27

您是否尝试过运行Product> Clean.为我解决了一个非常类似的问题.

  • 在我的视图层次结构中间只有两个出口是零.产品 - >清洁为我工作! (3认同)

Jon*_*ess 21

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

如果您使用初始化程序直接实例化您的类,则不会连接插座.Interface Builder创建类的自定义实例,并将这些实例编码为NIB和Storyboard以便重复解码,它不会自己定义类.如果这是您的问题,您只需要更改创建控制器的代码,而不是使用UIStoryboard或UINib上的方法.

  • 我正在创建一个UIStoryboard实例,并在其上调用instantiateViewControllerWithIdentifier。 (2认同)

Ste*_*ich 16

故事板没有识别我添加到其中的任何UI内容.在运行时,所有引用都是零.所以我清除了我的派生数据文件夹,然后再次使用这些连接.

  • 即使3年后,Xcode 9.2仍然拥有同样的该死的bug.非常感谢. (4认同)
  • 这就是答案。我为此战斗了一段时间,清理了构建文件夹和所有内容。在我的情况下,所有连接都是在viewDidLoad()中完成的,而在viewWillAppear()中几乎所有连接都是零(有时仍连接一两个)。我尝试了一切,最后删除了派生的数据文件夹,进行了重建,一切都很好。 (2认同)
  • 在此报告一下,这在 Xcode 11 中仍然存在。:( (2认同)

rou*_*nak 13

我的自定义集合视图单元格发生了这种情况.事实证明我必须用registerNib替换registerClassforReuseIdentifier方法.这为我解决了这个问题.


zin*_*ree 10

在我的情况下,它发生是因为我覆盖了loadView我的ViewController子类中的方法,但忘了添加[super loadView]

-(void)loadView {
// blank
}
Run Code Online (Sandbox Code Playgroud)

当您覆盖该loadView方法时,您有责任初始化子视图.由于您覆盖它,因此界面构建器中的视图无法转换为可可对象,因此出口保持为零.

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

或者只是打电话

[super loadView];
Run Code Online (Sandbox Code Playgroud)

这样超类就有机会将storyboard/xib加载到代码中.


Eri*_*ner 9

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


zs2*_*020 8

您可以调用controller.viewforce来加载视图以初始化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
    }
}
Run Code Online (Sandbox Code Playgroud)


Fat*_*tie 7

2019 年,这一可怕问题的一种可能性是:

  • 假设您可能有一个显示某种时钟的容器视图。所以你有了

    时钟类:UIViewController

实际上,您在应用程序的许多地方都使用了它。

在主屏幕、详细信息屏幕、编辑屏幕上。

您有一个复杂的、类似 Snapchat 的现代应用程序。

事实上,实际上可能在同一屏幕上的某个地方同时Clock加载多次。(也许在某些情况下它是隐藏的。)

您开始处理Clock众多故事板之一的一个实例。

在该故事板上添加一个标签 NewLabel。

当然,您可以在代码中添加插座。一切都应该有效。所有其他插座都工作正常。

肯定已经链接了插座。

但应用程序崩溃,NewLabel为零。

Xcode 清楚地告诉您“您忘记连接插座”。

原因是这样的......你只有在时钟的故事板用途之一上有“NewLabel”!

崩溃实际上来自>>>另一个地方<<<<您正在使用时钟!!!!

Xcode不会告诉您崩溃完全来自另一个地方,而不是来自您工作的地方!

崩溃实际上不是来自您正在工作的地方 - 它来自另一个故事板,该故事板上没有“NewLabel”项目!

令人沮丧。


小智 6

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

通过简单地使用init()from 超类不能启动您使用故事板的任何内容。所以你需要做的是改变 ViewController 的初始化。替换 let XXViewController = XXViewController()let XXViewController = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle()).instantiateViewControllerWithIdentifier("XXViewController") as! XXViewController 这告诉程序去故事板找到 XXViewController 并启动IBOutlet故事板中的所有内容。

希望能帮到你~GL


Hug*_*otl 6

对我来说,当我意外地将我的视图控制器类声明为时,就会发生这种情况

class XYZViewController: UINavigationController {
}
Run Code Online (Sandbox Code Playgroud)

(即UINavigationController不是a UIViewController).

Xcode中没有对这个错误回暖,类似乎打造精品,并覆盖功能,例如viewDidLoad,viewWillAppear所有的正常工作等.但没有一个是IBOutlet连接的.

将声明更改为

class XYZViewController: UIViewController {
}
Run Code Online (Sandbox Code Playgroud)

完全修复它.


Vin*_*ino 5

如果您view controller以编程方式实例化。然后尝试如下创建

let initialVC = self.storyboard?.instantiateViewController(withIdentifier: "InitialVC") as! InitialVC
Run Code Online (Sandbox Code Playgroud)

而不是直接

let initialVC = InitialVC()
Run Code Online (Sandbox Code Playgroud)

这对我有用。