2017-04-21 64 views
0

我顯然對Swift很新,儘管我的應用工作得很好,但我需要一些幫助。我有一個非常漂亮的單窗口(OSX,不是iOS)應用程序,但我需要添加一個「首選項」窗口。我創建了窗口並將其鏈接到「首選項」菜單(將其打開並按預期顯示)。但是,現在我需要與我設置的文本字段進行交互。如何連接子窗口的文本字段?

這是我的新窗口: Settings.xib

這裏是我的主窗口: MainMenu.xib

同樣,我可以顯示它只是罰款,但我需要能夠設置文本值設置窗口中的字段。不確定如何做到這一點?我正試圖遠離Storyboards(只是試圖保持簡單;也許是第二階段)。我將Settings窗口中的值存儲在鑰匙串中(在MainMenu.xib中運行得非常好)。現在我只需要能夠輸入它們並從Settings.xib保存它們。

我的文件結構非常簡單。我有AppDelegate.swift這是做所有的工作。我(和我怎麼)連接Settings.xibAppDelegate?我知道我可以將Settings.xib的文本字段綁定到AppDelegate網點(但是當我這樣做時,我得到一個錯誤:[General] [valueForUndefinedKey:]:此類不是關鍵值編碼兼容的關鍵accountNumber)。

我知道這是一個​​的問題,但它很簡單,很難找到適用的答案。

謝謝!

+0

我建議爲設置寫一個窗口控制器。它將有自己的nib文件,並且將字段連接起來會很簡單。 –

+0

謝謝@johnelemans。花了我一些時間來弄清楚如何做到這一點,但就是這樣。像冠軍一樣工作。感謝您的指導! – Bossman13

回答

0

創建一個新的窗口控制器是關鍵。正如我在我的問題中所述,我的問題是將文本字段作爲功能插座進行連接。我能夠根據需要顯示窗口,但無法訪問文本字段。我創建了SettingsWindowController.swift子類NSWindowController。我的連接如圖所示:

Window connections

File's Owner connections

另外,在Settings.xib,的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

`var prefs: SettingsController? = nil 

@IBAction func OpenPreferences(_ sender: Any) { 
    DispatchQueue.main.async(execute: {() -> Void in 
     NSApplication.shared().runModal(for: (self.prefs?.window)!) 
    }) 
}` 

func applicationDidFinishLaunching(_ aNotification: Notification) 
{ 
    // Insert code here to initialize your application 

    prefs = SettingsController() 
}` 

希望這可以幫助其他人。