2010-09-07 45 views
0

我正在使用自定義子類NSDocument和自定義子類NSWindowController。問題是我無法從我的自定義窗口控制器中引用我的自定義文檔。在NSWindowController子類中,[self document]返回null

在IB中,在TKDocument NIB中,我將文件所有者設置爲TKWindowController

在我TKDocument子,我有:(在TKWindowController再次)

- (void) setDocument(NSDocument *) document { 
    NSLog(@"setDocument:%@", document); 
    [super setDocument:document]; 
} 

,然後我的行動:

- (void) makeWindowControllers { 
    TKWindowController *controller = [[TKWindowController alloc] init]; 
    [self addWindowController:controller]; 
} 

然後在我的TKWindowController子我推翻setDocument,以確保它被稱爲其中引用文件本身:

- (IBAction) plotClicked:(id) sender { 
    TKDocument *doc = [self document]; 
    NSLog(@"plotClicked %@", doc); 
} 

如我所料,NSLog輸出我的[TKDocument description]覆蓋返回的字符串;我只是把它放在那裏看看它是否被調用。但是,docplotClicked爲空。

我可能做錯了什麼?

編輯:我相信問題是與NIBs。如上所述,我的文檔擁有自己的NIB,並將文件所有者設置爲自定義控制器。從MainMenu.xib中的菜單項觸發plotClicked操作。我相信它正在創建一個與當前活動文檔無關的新控制器實例。

那麼,我如何鏈接兩個?我的問題是這樣的:如何從MainMenu.xib獲取當前活動文檔(或其窗口控制器)的句柄?

感謝

回答

1

我的文檔有它自己的NIB,文件的所有者設置爲自定義控制器,如上所述。

文件夾的文件所有者應該是文件。考慮一下嫌疑犯#1。

從MainMenu.xib的菜單項觸發plotClicked操作。我相信它正在創建一個與當前活動文檔無關的新控制器實例。

您是否在您的主菜單筆尖內放置了一個窗口控制器?如果不是,那麼這不是問題,因爲您必須將您的plotClicked:菜單項連接到First Responder,並且窗口控制器及其文檔將位於響應者鏈中。

如果你這樣做,那麼有一個解決方案:從MainMenu筆尖刪除窗口控制器,並將你的菜單項連接到First Responder,以便動作消息沿響應者鏈下去,這將使它能夠擊中文件或窗口控制器。

如何獲得...的句柄?

Mac上唯一的句柄來自碳;這些把手不存在可可。

+0

彼得,謝謝。我確實有一個窗口控制器,隨後我將其移除。我現在已經將菜單項連接到First Responder,它現在可以工作。我不確定*爲什麼*它的工作原理:我知道該事件正在流向響應者鏈,但在窗口控制器上的操作plotClicked在文檔筆尖中未連接。我需要閱讀更多關於這個。 – 2010-09-07 17:33:57

+0

你說文件的所有者應該是文件。使用自定義窗口控制器的情況仍然如此嗎?如果是這樣,我如何訪問NIB中的控制器?我不認爲在文檔NIB中實例化自定義窗口控制器是正確的。感謝您先前明確回答了一個非常模糊的問題。 – 2010-09-07 17:36:40

+0

您不需要在任何nib中實例化窗口控制器,因爲它的任務是加載nib。爲什麼要從筆尖中的物體訪問控制器,而不是文檔? – 2010-09-07 17:38:38

0

init不是NSWindowController的指定初始化。您需要其中的一個:– initWithWindow:,– initWithWindowNibName:,– initWithWindowNibName:owner:– initWithWindowNibPath:owner:

此外,從the docs

在你的類的初始化方法, 一定要調用的超一方 的initWithWindowNibName的:... 初始化或initWithWindow: 初始化。哪一個取決於 窗口對象是否在nib文件中創建了 或者以編程方式創建了 。

+0

謝謝,雖然我不認爲這是因爲我的'init'方法包含對'[super initWithWindowNibName:@「TKDocument」]'的調用。如果更好的做法,我將直接從Document調用'initWithWindowNibName',並在Controller中覆蓋它以執行其他初始化。 – 2010-09-07 16:47:14

+0

TimG:如果您的自定義'init'調用NSWindowController的初始值設定項之一,則可以調用您的自定義'init'。 – 2010-09-07 17:15:13