2009-06-14 54 views
-7

你將如何子類NSOutlineView?子類化NSOutlineView

+3

簡短的回答是:你用同樣的方法子類化任何對象。你應該嘗試更具體的問題。蘋果的文檔涵蓋了子類,所以我們必須假設你已經閱讀並嘗試了一些東西然後被卡住了。你卡在哪裏? – 2009-06-14 08:46:36

+0

對不起,我沒有閱讀所有關於子類的Apple文檔。 – Joshua 2009-06-14 13:54:22

回答

14

首先,你子類的對象之前,你應該問自己「我需要這樣做嗎?」。子類化是交互和擴展其他類的功能的一種更復雜的方式,所以你應該確保你想要實現的內容不能通過另一個更簡單的方法,例如委託,通知等來輕易實現。顯然,如果你嘗試要改變控件的外觀,這將通過子類化更容易完成,但要確保檢查所有其他可用選項。請記住,NSOutlineView有一個相當長的對象樹 - 它繼承自NSTableView,它繼承自NSControl,它繼承自NSView,繼承自,它繼承自NSObject,並且存在各種類型的輔助方法幫助你實現你想要的。

但是,如果您檢查所有這些選項並決定子類NSOutlineView,這取決於您想要對您的子類執行什麼操作。創建子類的shell的最簡單方法是選擇File > New File,然後選擇Objective-C class,就像使用任何其他類一樣,它將創建一個具有頭文件和實現文件的新類,該類繼承自NSObject。然後,你可以簡單地改變行頭文件:

@interface MyClass : NSObject { // Where MyClass is the name of your class 

@interface MyClass : NSOutlineView { 

這將導致你的類從NSOutlineView繼承。由於它是NSOutlineView的子類,因此可以爲您提供很多機會來更改控件的默認行爲。

因爲要創建一個子類,您可以更改任何方法了對象樹的默認實現 - 也就是說,你可以覆蓋NSOutlineView宣佈,NSTableViewNSControlNSViewNSResponderNSObject方法,(雖然你應該很少覆蓋在NSObject中聲明的方法)。你不需要在你的頭文件中重新定義方法簽名,你可以通過在你的子類的實現中實現它來覆蓋函數。例如,如果你想覆蓋的NSViewdrawRect:方法,你會做以下的子類的實現:

- (void)drawRect:(NSRect)rect //Method signature from the docs 
{ 
    //Code here 
} 

drawRect:是在你的類調用,你的代碼會被執行,而不是在NSView代碼。

你也可以通過方法調用你不想處理的方法。這是默認完成的,所以您不需要創建空方法,只需調用super上的方法,但是,如果您重寫某個方法並希望允許其中一個超類先處理它,則可以執行以下操作:

- (void)expandItem:(id)item 
{ 
    [super expandItem:item]; 

    //Your code here 
} 

例如,如果您想更改類中的某個變量,這將是有益的,但通過首先將該方法調用到樹上來提供方法的默認實現。

子類化可以是一個相當複雜的過程,特別是對於像控件這樣的複雜對象,雖然它可能非常有用和強大。

3

@interface MyOutlineView : NSOutlineView { ... } ... @end

+0

哦,我明白了,我會在什麼地方放點? – Joshua 2009-06-14 07:56:50