我尝试构建一个示例Cocoa应用程序,我想将故事板上的UI组件作为ViewController.swift
或IBOutlet
连接到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。并启动了故事板的模板。
答案 0 :(得分:6)
虽然上面的答案正确地指出这不是编译问题的原因,但我认为我会澄清那些只想完全消除警告信息的人。当我找到这个页面时,这就是我所寻找的。 p>
当您构建操作并且某些操作发生更改或在故事板中被删除时,网点仍然存在。选择旧的未使用操作所在的控制器/窗口,您仍然可以在属性选项卡中的故事板的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"到"定制":
就是这样:
答案 2 :(得分:2)
我想我找到了正确的解决方案。
1)将一个Object拖入你的xib界面。
2)单击刚刚拖入的左侧列表中的对象。
3)将Object绑定到您的自定义类。(这里我的类是一个登录窗口控制器作为示例)
4)按住Ctrl键拖动到源代码。在弹出窗口中,选择您的类名(这里的示例是Login Window Controller)而不是File的所有者。
希望这可以帮到你。
答案 3 :(得分:2)
这些天我在编码时找到了另一种更简单的解决方案。
检查一下。
1)在.xib文件中选择文档大纲中的文件所有者。
2)指定要与.xib文件连接的类。
3)现在,当您将插座连接到源文件时,只需使用默认文件的所有者。更容易。
4)我猜到目前为止还不够。我在运行时遇到一个异常,称为'加载'xxx'笔尖,但未设置视图插座'。我们应该做更多的事情。
在“文档大纲”中选择视图。从New Referencing Outlet的圆圈拖动到Document Outline中的File's Owner。
好的,这是新的更简单的解决方案。不应将其他对象添加到xib中。如果它不起作用,请在下面留下评论。