Swift的IBOutlets是零

时间:2014-09-19 17:53:56

标签: macos swift iboutlet

(在OSX 10.9,Xcode 6.1b上开发)

如果我在AppController中声明IBOutlets,一切都很好。我在InterfaceBuilder中实例化一个对象,将其拖动到一个出口,当我到达applicationDidFinishLaunching时,我的IBOutlets被填充,一切都很棒。

如果我更进一步抽象并在InterfaceBuilder(NSObject的子类)中实例化一个自定义控制器对象,并将我的一个对象声明为该类中的IBOutlet,它们就是零,每一个。< / p>

我可以设置连接就好了,IB似乎确信它存在,'引用的出口'列表是正确的,但它不需要,而且我无法在文档中找到任何内容

  

它是隐式解包的,因为在从故事板或xib文件初始化类之后,您可以假设插座已连接。

好吧,我假设。

我的所有代码都是样板Xcode产品:

@IBOutlet weak var sceneController:NSArrayController!

我已经检查并仔细检查了连接并进行了三重检查。我看过几十个iOS教程(虽然我找不到OSX的等价物)所有这些似乎都是主题的变化'是的,你可以在AppController以外的文件中完全声明一个插座,只需确保每个涉及的实例都存在'。

(在撰写本文时,'mac'文档使用了以UIButton等为特色的示例。)

我没有想法。很明显,连接没有形成,大概是因为对象是以“控制器类优先,IBOutlets以后”之外的顺序实例化的,但是我如何强制连接呢?

2 个答案:

答案 0 :(得分:4)

@IBOutlet weak var sceneController: NSArrayController!

weak关键字是您的问题。如果在系统完成对您的笔尖的解码之后,没有任何其他内容引用NSArrayController,则系统会立即将出口设置为nil并取消分配NSArrayController

尝试从您的媒体中删除weak关键字。

更新

添加此代码:

@IBOutlet var sceneController: NSArrayController! {
    didSet {
        NSLog("sceneController set to %@", sceneController);
    }
}

输出是什么?在NSLog上设一个断点。它被击中时的堆栈跟踪是什么?是否反复击中?

答案 1 :(得分:0)

我有类似的问题

我有一个按钮,可以将我从一个视图控制器转到另一个视图控制器。在这个按钮的事件处理程序中,我试图在第二个视图中为某些GUI组件设置值。不幸的是,我获得了这些组件的零值。

解决方案是等待按钮处理程序退出,然后在第二个视图中更改GUI组件(尝试第二个视图控制器上的viewDidLoad()函数)。据推测,在我离开处理程序并切换视图之前,这些GUI组件尚未分配。

yuen helbig