IBOutlet是零,但它连接在故事板,斯威夫特
使用Swift 1.1和Xcode 6.2。
我有一个UIStoryboard包含一个单独的,自定义的UIViewController
子类。 在它上面,我有一个从该控制器到故事板上的UIView
子类的@IBOutlet
types的UIView
连接。 我也有类似的观点。 见图A.
但在运行时,这些属性是零(图B)。 即使我确信我已经连接了Interface Builder中的sockets。
想法 :
- 是否有可能是因为我正在使用一个子类的子类的东西混乱的初始化? 我并不是压倒任何初始者
-
awakeFromNib:
由于某种原因没有被调用 - 也许它不会连接到子视图上的子视图
我已经尝试过的事情:
- 完全匹配
@IBOutlet
和storyboard项目types(而不是UIView
) - 删除财产和出路,并重新添加
图A *
图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立罚款,并重写函数,如viewDidLoad
, viewWillAppear
等都正常工作。 但是没有一个IBOutlet
被连接。
将声明更改为
class XYZViewController: UIViewController { }
完全修复它。
其他情况:
你的sockets将不会被设置,直到视图控制器的视图被实例化,在你的情况下,可能发生在initWithNibName:bundle:-at之后不久,它们仍然是零。 你所做的任何涉及这些sockets的设置应该发生在你的视图控制器的-viewDidLoad方法中。
- select
.h
和.m
视图控制器文件 - 删除这些文件的引用
- 重新添加文件到你的项目树
- 打开故事板,最终重新构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
类