Swift的IBOutlets是零

gre*_*ght 11 macos iboutlet swift

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

如果我在AppController中声明IBOutlets,一切都很好.我在InterfaceBuilder中实例化一个对象,拖动它来形成一个插座,当我到达applicationDidFinishLaunching时,我的IBOutlets被填充,一切都很棒.

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

我可以设置连接就好了,IB似乎确信它存在,'引用的出口'列表是正确的,但它不需要,我在文档之外找不到任何东西

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

好吧,我假设.

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

@IBOutlet弱var sceneController:NSArrayController!

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

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

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

rob*_*off 5

@IBOutlet weak var sceneController: NSArrayController!
Run Code Online (Sandbox Code Playgroud)

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

尝试weak从您的网点中删除关键字。

更新

添加此代码:

@IBOutlet var sceneController: NSArrayController! {
    didSet {
        NSLog("sceneController set to %@", sceneController);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是什么?将断点放在NSLog. 命中时的堆栈跟踪是什么?是不是反复打?

  • 弱是可以的。我有@objc,但没有@objc(className)。显然 (className) 是必需的,这很荒谬。 (2认同)