如何从子窗口连接文本字段?

时间:2017-04-21 21:11:00

标签: swift xcode macos

我显然对 Swift 非常陌生,尽管我的应用程序工作得很好,但我需要一些帮助。我有一个单窗口(OSX,而​​不是iOS)应用程序,可以很好地工作,但我需要添加一个首选项窗口。我创建了窗口并将其链接到“首选项”菜单(它打开并按预期显示)。但是,现在我需要与我设置的文本字段进行交互。

这是我的新窗口: Settings.xib

这是我的主窗口: MainMenu.xib

同样,我可以很好地显示它,但我需要能够在“设置”窗口中设置文本字段的值。不确定如何做到这一点?我正试图远离故事板(只是试图保持简单;也许是第二阶段)。我将Settings窗口中的值存储在Keychain中(在MainMenu.xib中可以很好地工作)。现在我只需输入它们并将其保存在Settings.xib

我的文件结构非常简单。我有AppDelegate.swift正在完成所有工作。我(以及如何)将Settings.xibAppDelegate联系起来?我知道我可以将Settings.xib中的文本字段绑定到AppDelegate中的出口(但是当我这样做时,我得到一个错误:[General] [valueForUndefinedKey:]:此类不符合键值编码对于关键accountNumber)。

我知道这是一个n00b问题,但很简单,很难找到合适的答案。

谢谢!

1 个答案:

答案 0 :(得分:0)

创建一个新的窗口控制器是关键。正如我在我的问题中所述,我的问题是将文本字段连接成功能插座。我能够根据需要显示窗口,无法访问文本字段。

我创建SettingsWindowController.swift到子类NSWindowController。我的联系如下所示:

Window connections

File's Owner connections

此外,在Settings.xib中,Custom Class的{​​{1}}设置为File's Owner。然后,各个文本字段作为出口连接到SettingsWindowController

SettingsWindowController.swift

SettingsWindowController.swift

`import Cocoa class SettingsController: NSWindowController, NSWindowDelegate { @IBOutlet weak var accountNumber: NSTextField! @IBOutlet weak var meterNumber: NSTextField! @IBOutlet weak var webCredentialKey: NSTextField! @IBOutlet weak var webCredentialPassword: NSTextField! // allows window creation without needing to specify NIB name override var windowNibName: String! { return "Settings" } override func windowDidLoad() { super.windowDidLoad() // initialization code removed for brevity } func windowWillClose(_ notification: Notification) { // teardown code removed for brevity NSApplication.shared().stopModal() } }'

AppDelegate.swift

希望这有助于其他人。