2009-11-23 40 views
0

編輯:如果有人想看看實際的代碼,那就是: http://pastie.org/713951不能訪問任何網點loadNibNamed

長話短說:我遇到的問題是我不能讓窗口顯示在fly()函數中。

完整說明

我創建適用於Mac的應用程序 '科達' 的插件。我有一個控制器'大膽',有兩個插座:

@class Bolder; 

@interface Bolder : NSObject 
{ 
    IBOutlet id MyLabel; 
    IBOutlet id theWindow; 
} 

Coda指定它是自己的插件初始化方法。在這個init方法,我加載筆尖「超人」和選擇的方法「飛」點擊我的插件時,將調用:

[NSBundle loadNibNamed:@"Superman" owner:self]; 
[controller registerActionWithTitle:NSLocalizedString(@"OK!", @"Flying Man") target:self selector:@selector(fly:)]; 

在「飛」的方法,我想展示的窗口和變化標籤上的文字:

- (void)fly:(id)sender 
{ 
    [theWindow orderFront:self]; 
    [theWindow makeKeyAndOrderFront:self]; 
    [MyLabel setStringValue:@"new text"]; 
} 

這最後一點是我扔的部分 - 窗口只顯示不出來!然而,如果我把這三條線放在'awakeFromNib'裏面,它顯示的很好。什麼造成這種差異?我不能把這段代碼放在awakeFromNib裏面,因爲這會導致我的插件窗口在每次啓動Coda時顯示出來。

回答

0

嘗試延緩你的筆尖加載,直到顯示窗口。例如:

- (void)fly:(id)sender 
{ 
    if (!theWindow) 
    { 
     [NSBundle loadNibNamed:@"Superman" owner:self]; 
    } 
    else 
    { 
     [theWindow makeKeyAndOrderFront:self]; 
    } 
} 
+0

我試過......沒有什麼區別。 – 2009-11-25 02:44:55

+0

編輯我的答案。 – Darren 2009-11-25 03:54:01

+0

謝謝!這絕對有效,因爲我可以將所有初始化代碼放在'awakeFromNib'中而不是'fly'並且沒關係......但是我仍然想知道爲什麼我無法從fly中訪問任何實例變量或方法。我剛剛創建了一個測試實例方法,我可以從'awakeFromNib'中調用它,但不能從'fly'中調用它;你能想到可能發生的任何原因嗎? – 2009-11-25 04:17:50

0

如果您不希望它在加載筆尖時顯示,請取消選中Interface Builder中窗口的「Visible At Launch」。

+0

即使我這樣做,我試圖設置標籤中的文本,我想在init中執行它...但我無法訪問它。 – 2009-11-23 01:18:23

+0

我不相信網點會保證在初始化過程中連接起來;你有沒有嘗試將你的setter移動到'-awakeFromNib'? – Wevah 2009-11-23 01:53:33

+0

是的,我有......這是針對我正在嘗試開發的一個插件,我認爲問題可能出在我嘗試製作的應用程序上。我已經編輯了一下這個問題,看看你是否有時間:) – 2009-11-23 02:52:21