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*

图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.
Jon*_*ess 21
您是从Storyboard还是NIB实例化视图控制器,还是直接通过初始化程序实例化它?
如果您使用初始化程序直接实例化您的类,则不会连接插座.Interface Builder创建类的自定义实例,并将这些实例编码为NIB和Storyboard以便重复解码,它不会自己定义类.如果这是您的问题,您只需要更改创建控制器的代码,而不是使用UIStoryboard或UINib上的方法.
Ste*_*ich 16
故事板没有识别我添加到其中的任何UI内容.在运行时,所有引用都是零.所以我清除了我的派生数据文件夹,然后再次使用这些连接.
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加载到代码中.
您可以调用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)
假设您可能有一个显示某种时钟的容器视图。所以你有了
时钟类:UIViewController
实际上,您在应用程序的许多地方都使用了它。
在主屏幕、详细信息屏幕、编辑屏幕上。
您有一个复杂的、类似 Snapchat 的现代应用程序。
Clock加载多次。(也许在某些情况下它是隐藏的。)您开始处理Clock众多故事板之一的一个实例。
在该故事板上添加一个标签 NewLabel。
当然,您可以在代码中添加插座。一切都应该有效。所有其他插座都工作正常。
您肯定已经链接了插座。
但应用程序崩溃,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
对我来说,当我意外地将我的视图控制器类声明为时,就会发生这种情况
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)
完全修复它.
如果您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)
这对我有用。