我显然对 Swift 非常陌生,尽管我的应用程序工作得很好,但我需要一些帮助。我有一个单窗口(OSX,而不是iOS)应用程序,可以很好地工作,但我需要添加一个首选项窗口。我创建了窗口并将其链接到“首选项”菜单(它打开并按预期显示)。但是,现在我需要与我设置的文本字段进行交互。
这是我的新窗口: Settings.xib
这是我的主窗口: MainMenu.xib
同样,我可以很好地显示它,但我需要能够在“设置”窗口中设置文本字段的值。不确定如何做到这一点?我正试图远离故事板(只是试图保持简单;也许是第二阶段)。我将Settings
窗口中的值存储在Keychain中(在MainMenu.xib
中可以很好地工作)。现在我只需输入它们并将其保存在Settings.xib
。
我的文件结构非常简单。我有AppDelegate.swift
正在完成所有工作。我(以及如何)将Settings.xib
与AppDelegate
联系起来?我知道我可以将Settings.xib
中的文本字段绑定到AppDelegate
中的出口(但是当我这样做时,我得到一个错误:[General] [valueForUndefinedKey:]:此类不符合键值编码对于关键accountNumber)。
我知道这是一个n00b
问题,但很简单,很难找到合适的答案。
谢谢!
答案 0 :(得分:0)
创建一个新的窗口控制器是关键。正如我在我的问题中所述,我的问题是将文本字段连接成功能插座。我能够根据需要显示窗口,无法访问文本字段。
我创建SettingsWindowController.swift
到子类NSWindowController
。我的联系如下所示:
此外,在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
希望这有助于其他人。