2012-08-07 49 views
0

當我嘗試設置觀察這個特定鍵時,沒有任何反應。這是我的意思。NSArrayController - 觀察選擇索引

我有一個標準的Cocoa應用程序,帶有NSTableView,我想出瞭如何根據選擇的單元格來更改圖像視圖中顯示的圖像。

現在,我想弄清楚如何通過選定的索引禁用/啓用按鈕。我的意思是,我在窗口中有一個按鈕,它在某些索引上被禁用。

SomeClass的的init方法

-(id)init { 
    if (self=[super init]) { 
     [arrayController addObserver:self forKeyPath:@"selectionIndex" options:NSKeyValueObservingOptionNew context:NULL]; 
    } 
} 

然而,當我實現observeValueForKeyPath:方法,所做的更改不會被拾起我挑選新指標。事實上,如果我嘗試記錄它,插座會顯示(null)。然而,當我在AppDelegate中添加觀察者時,AppDelegate(當作爲觀察者指定時)會提取更改。

有沒有一些原因,我的泛型SomeClass對象不?它應該以不同的方式完成嗎?

注:

我試着子類SomeClass的一個NSWindow,然後使該窗口的所有者SomeClass的,並在awakeFromNib設立觀察員,這工作,但似乎是一個不錯的方法來做到這一點。

+0

如何以及在哪裏做SomeClass上的alloc init?此外,你的意思是「插座顯示(空)」 - 什麼插座? – rdelmar 2012-08-07 01:37:52

+0

SomeClass有一個它與nib窗口(藍色立方體事件)一起被初始化的實例,並且在初始化SomeClass(甚至在之後)的實例期間,如果我做NSLog(@「%@」,arrayController),我會得到'(null)'。 (arrayController設置爲插座) – 2012-08-07 02:00:05

+1

您是否檢查過您的init是否被調用?如果此類的實例是在nib中創建的,則應該將代碼置於awakeFromNib中。 – rdelmar 2012-08-07 02:04:13

回答

4

init方法發生在過程中,在插座連接之前(我認爲)發生得太早。將代碼放入awakeFromNib將正常工作。這是蘋果的文檔在NSObject類參考:

筆尖裝載基礎設施發送awakeFromNib 消息從筆尖檔案重建每個對象,但只有在 所有存檔的對象已經被加載並初始化。當一個對象收到awakeFromNib消息時,它保證已經建立了 所有的出口和動作連接。

+0

我讀到了,現在我只是想知道是否它是一個壞主意(因爲我得到它的工作)通過繼承我的SomeClass作爲NSWindow的後代,並從那裏工作。現在一切都很好,但在我的NSTableView,我的程序崩潰,如果我點擊一個空單元格(超出界限錯誤。)我的觀察方法沿'SomeClass * object = [someArray objectAtIndex:[arrayController selectionIndex] ]'。有沒有解決辦法? – 2012-08-07 04:44:37