大家晚上好
我正在慢慢开发我的第一个 OS X 应用程序。我一直很难让我的 Swift 类与 NSPopUpButton 交互。为了确保我做对了,我创建了一个新项目并成功删除了所有条目并通过 AppDelegate 在 NSPopUpButton 中输入了文本。但是,一旦我尝试将相同的功能移动到我自己的类中,我什至无法将 IBOutlet 连接连接到新类。
新类是否需要特定的子类类型才能与界面构建器一起正常工作?
这是我创建的类的屏幕截图,以及我尝试调用属于此类的函数的 AppDelegate。
最后,这里是有问题的 IB 元素,我应该能够在“自定义类”检查器下选择我自己的类吗?
最佳答案
我是一名 iOS 开发人员,但我想同样的原则也适用于您的情况。
ViewController 类和在界面生成器中创建的界面是两个独立的事物。虽然看起来它们是通过 iboutlet 连接的,但它们实际上是独立的,并且可以在没有另一个的情况下实例化一个。
目前,您只是在 App Delegate 中创建 ViewController 类的一个实例——仅此而已。系统根本不知道你的 xib 存在!只有当您的应用程序将您的 xib 连接到您的 ViewController 类时, socket 才会连接。
我们如何做到这一点?其实很简单。而不是像这样实例化我们的 View Controller :
let viewcontroller = ViewController()
我们会在实例化中将我们的 View Controller 连接到我们的 xib:
let viewcontroller = ViewController(nibName: "MainWindow", bundle: NSBundle().mainBundle)
nibName
告诉系统你的 xib 的文件名,NSBundle().mainBundle
告诉系统在哪里寻找 xib。
就像你提到的那样,只有当你的 xib 被分配了一个自定义类时,这一切才有效。在界面生成器中的 xib 中,选择整个 View Controller 。然后,在自定义类检查器中输入您的 ViewController 类的名称(在您的例子中:ViewController - 它应该自动完成)。这将确保您的 socket 已连接。
你应该被设置!如果您还有其他问题,请告诉我。
祝你好运!
编辑:
这取代了我的答案的第一部分,但是关于在 Storyboard 中连接事物的部分仍然是正确的。重新考虑后,我相信我已经意识到我们只是在创建 View Controller ,而不是将它添加到我们的 View 中。尽管如此,我相信我们可以通过向 View Controller 子类(我们在 Storyboard 中设置的方法)添加一个方法来采取捷径解决方案。开始输入 viewDidLoad
,它应该会自动完成。在方法的开头输入 super.viewDidLoad()
。之后,键入 self.listUpdate()
。如果类在 Storyboard 中正确连接,这应该可以工作。这意味着您可以删除在 App Delegate 中创建的变量。
引用:您可能还会发现 Apple 关于创建 View Controller 的文档(它在 Objective C 在线,但可以轻松转换为 Swift - 这是重要的概念):NSViewController Class Reference
关于xcode - 通过 IBOutlet 与 Interface Builder 交互的 Swift 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26268833/