3

我是一個MacRuby和可可的完整n00b,所以請記住在回答時 - 我需要大量的細節和解釋。 :)MacRuby +界面生成器:如何顯示,然後關閉,然後再次顯示一個窗口

我已經建立了一個簡單的項目,它有2個窗口,它們都是用Interface Builder構建的。第一個窗口是使用表格視圖的簡單帳戶列表。它在表格下方有一個「+」按鈕。當我點擊+按鈕時,我想顯示一個「添加新帳戶」窗口。

我還有一個AccountsController < NSWindowController和一個AddNewAccountController < NSWindowController類,它們被設置爲這些窗口的代表,並使用適當的按鈕點擊方法連接,並且插座引用所需的窗口。

當我點擊帳戶窗口中的「+」按鈕,我有這樣的代碼火:

@add_account.center 
    @add_account.display 
    @add_account.makeKeyAndOrderFront(nil) 
    @add_account.orderFrontRegardless 

這個偉大的工程,我第一次點擊+按鈕。一切都顯示出來了,我可以輸入數據並將其綁定到我的模型。但是,當我關閉添加新帳戶表單時,情況開始變差。

如果我設置添加新帳戶窗口關閉,然後第二次點擊+按鈕,窗口仍然會彈出,但它被凍結。我無法點擊任何按鈕,輸入任何數據,甚至關閉表格。我認爲這是因爲表單的代碼已經發布,所以沒有消息循環處理表單......但我不完全確定這一點。

如果我設置添加新帳戶窗口不關閉,然後第二次我點擊+按鈕,窗口顯示正常,它是可用的 - 但它仍然有我以前輸入的所有數據...它仍然綁定到我以前的Account類實例。

我做錯了什麼?當我點擊賬戶表格上的+按鈕時,創建添加新賬戶表單的新實例,創建新的賬戶模型,將該模型綁定到表單並顯示錶單,有什麼正確的方法?

...這是所有正在對OSX 10.6.6,64位完成後,用了XCode 3.2.4

+0

您是否已將其他元件連接到控制器(按鈕/ textareas)?我有麻煩的下面的教程顯示nsobjects下拉菜單控制器消息 – 2011-02-27 10:08:12

回答

1

的問題是,它不創建窗口每次。關閉時釋放是一個令人討厭的選項,通常只有當您知道窗口關閉時窗口控制器也被釋放時纔會使用。 (注意我從來沒有使用過MacRuby,所以我會在Obj-C中提供代碼,因爲我知道它是正確的,希望你可以將它轉換。我會假定GC是和MacRuby一樣的。

現在有兩種方法可以做到這一點。我不完全確定你的NIB /課程是如何建立的,因爲它可能是兩種方式之一。

-

來解決它的第一種方式是使用您使用的表單元素提及空出來的網點,當您再次顯示窗口,例如[myTextField將setStringValue:@「」]。如果你使用的是可可綁定,那麼它有點棘手,但基本上你必須確保綁定的對象是空白的。如果你是Cocoa的新手,我會建議你不要綁定。

-

第二種方法是使AddNewAccountController類NSWindowController的子類。當您按下+按鈕時,您將創建一個新的實例並顯示它(請記住將它存儲在ivar中)。最好的辦法是這樣的:

if (!addAccountController) { 
    addAccountController = [[AddNewAccountController alloc] initWithWindowNibName:@"AddNewAccountController"]; 
    [[addAccountController window] setDelegate:self]; 
} 
[addAccountController showWindow:self]; 

這可以防止在窗口已經可見的情況下產生新的實例。然後,您需要實現委託:

- (void)windowWillClose:(NSNotification *)notification { 
    //If you don't create the account in the AddNewAccountController then do it here 
    addAccountController = nil; 
} 

顯然,你需要將窗口移動到一個單獨的NIB稱爲「AddNewAccountController」。在此NIB中,確保將文件所有者的類設置爲AddNewAccountController,然後將文件所有者的窗口連接到窗口。

當所有這些設置完成後,您每次都會得到一個新的控制器/窗口。它還具有將筆尖和控制器分成更集中的單元的好處。

-

最後一件事。雖然在窗口中做這樣的事情是很好的,但您最終可能希望通過表單來做這件事,因爲這樣可以防止添加帳戶窗口隱藏在其他窗口後面的可能性。

+0

在xcode中,我沒有什麼明顯的。 :)所以,一個.xib文件是一個NIB,對吧?我應該在單獨的NIB中組織所有與彼此相關的界面元素 - 一個窗口和一個菜單,控制器和其他對象 - 而不是像我現在正在做的那樣?這會讓我更好地控制什麼是加載的,什麼時候......以及NIB中的所有UI元素都是在加載NIB時創建的......並且我可以使用awakeFromNib實例化我的模型並將其綁定到窗口的.datasource。這聽起來正確嗎? – 2011-01-30 18:35:55

相關問題