无法在Cocoa和故事板中连接(故事板)插座(NSApplication)到(NSNibExternalObjectPlaceholder)错误

时间:2014-06-15 11:55:35

标签: xcode cocoa storyboard swift

我尝试构建一个示例Cocoa应用程序,我想将故事板上的UI组件作为ViewController.swiftIBOutlet连接到IBAction。但是,当我尝试控制 - 将故事板上的UI组件(例如NSButton)拖动到ViewController.swift并创建@IBAction方法,然后运行应用程序时,生成的应用程序会记录在控制台中关注消息,当然应用程序不响应我点击按钮。

Failed to connect (storyboard) outlet from (NSApplication) to (NSNibExternalObjectPlaceholder): missing setter or instance variable

如何正确使用IBAction方法?

这里的信息是我的ViewController.swift

import Cocoa

class ViewController: NSViewController {
    @IBOutlet var txtTitle : NSTextField
    @IBOutlet var boxColor : NSBox

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func colorChanged(cp: NSColorPanel) {
        let c:NSColor = cp.color;
        self.boxColor.fillColor = c
    }

    @IBAction func btnSetColor(sender : AnyObject) {
        let cp:NSColorPanel = NSColorPanel.sharedColorPanel()
        cp.setTarget(self)
        cp.setAction("colorChanged:")
        cp.orderFront(nil)

    }

    @IBAction func btnSetWindowTitle(sender : AnyObject) {
        if self.txtTitle.stringValue != "" {
            println(self.title)
            println(self.txtTitle.stringValue)
            self.title = self.txtTitle.stringValue
        }
    }
}

我在OS X 10.10 Yosemite上使用Xcode 6 beta。并启动了故事板的模板。

4 个答案:

答案 0 :(得分:6)

虽然上面的答案正确地指出这不是编译问题的原因,但我认为我会澄清那些只想完全消除警告信息的人。当我找到这个页面时,这就是我所寻找的。

当您构建操作并且某些操作发生更改或在故事板中被删除时,网点仍然存在。选择旧的未使用操作所在的控制器/窗口,您仍然可以在属性选项卡中的故事板的outlets段中看到它们。删除那些旧的操作/出口,然后警告消失。

查找ViewController和文件所有者之间的重复项。当他们不应该这样做时,其中一个或两个可能会坚持这些对象。删除这些将删除这些软警告。

答案 1 :(得分:5)

Failed to connect (storyboard) outlet from (NSApplication) to (NSNibExternalObjectPlaceholder): missing setter or instance variable

IBAction方法应该像它一样工作,请参阅Apple Dev论坛:

  

"这是一个已知问题......这些消息是无害的,不会   表示您的代码存在问题。"

Apple Dev Forums: OS X Storyboard failure

这不是您的代码无效的原因,您需要修复以下内容:

A)以下是我设置标题的工作代码 - 使用 self.view.window.title 代替self.title:

@IBAction func btnSetWindowTitle(sender : AnyObject) {
    if self.txtTitle.stringValue != "" {
        println(self.view.window.title)
        println(self.txtTitle.stringValue)
        self.view.window.title = self.txtTitle.stringValue
    }
}

B)在Interface Builder中,您需要设置NSBox" Box Type"到"定制": enter image description here

就是这样: enter image description here

答案 2 :(得分:2)

我想我找到了正确的解决方案。

enter image description here

1)将一个Object拖入你的xib界面。

enter image description here

2)单击刚刚拖入的左侧列表中的对象。

enter image description here

3)将Object绑定到您的自定义类。(这里我的类是一个登录窗口控制器作为示例)

enter image description here

4)按住Ctrl键拖动到源代码。在弹出窗口中,选择您的类名(这里的示例是Login Window Controller)而不是File的所有者。

希望这可以帮到你。

答案 3 :(得分:2)

这些天我在编码时找到了另一种更简单的解决方案。

检查一下。

enter image description here

1)在.xib文件中选择文档大纲中的文件所有者。

enter image description here

2)指定要与.xib文件连接的类。

enter image description here

3)现在,当您将插座连接到源文件时,只需使用默认文件的所有者。更容易。

enter image description here enter image description here

4)我猜到目前为止还不够。我在运行时遇到一个异常,称为'加载'xxx'笔尖,但未设置视图插座'。我们应该做更多的事情。

在“文档大纲”中选择视图。从New Referencing Outlet的圆圈拖动到Document Outline中的File's Owner。

好的,这是新的更简单的解决方案。不应将其他对象添加到xib中。如果它不起作用,请在下面留下评论。