2009-06-14 6 views
-7

Wie würden Sie ein NSOutlineView subclass?Subclassing NSOutlineView

+3

Die kurze Antwort ist: auf die gleiche Weise, wie Sie ein beliebiges Objekt unterklassifizieren. Sie sollten versuchen, genauer auf Ihre Fragen einzugehen. Apples Dokumentation deckt Unterklassen ab und wir müssen davon ausgehen, dass Sie das gelesen haben und etwas versucht haben und dann stecken geblieben sind. Wo bist du stecken geblieben? –

+0

Entschuldigung, ich hatte nicht alle Apple Docs auf Sub-Classing gelesen. – Joshua

Antwort

14

Erstens, bevor Sie eine Objektunterklasse, sollten Sie sich fragen "do ich brauchen, dies zu tun?". Subclassing ist eine komplexere Art der Interaktion und Erweiterung der Funktionalität anderer Klassen. Sie sollten also sicherstellen, dass das, was Sie erreichen möchten, nicht einfach durch eine andere, einfachere Methode wie Delegation, Benachrichtigungen usw. erreicht werden kann Um die Art und Weise, wie das Steuerelement aussieht, zu ändern, wird dies einfacher durch Unterklassen erreicht, aber stellen Sie sicher, dass Sie alle anderen verfügbaren Optionen überprüfen. Denken Sie daran, dass NSOutlineView einen ziemlich langen Objektbaum hat - er erbt von NSTableView, der von NSControl erbt, der von NSView erbt, der von NSResponder erbt, der von NSObject erbt, und es gibt verschiedene Hilfsmethoden, die in jeder dieser Klassen existieren Ihnen helfen, zu erreichen, was Sie wollen.

Wenn Sie jedoch alle diese Optionen überprüfen und sich für die Unterklasse NSOutlineView entscheiden, hängt es davon ab, was Sie mit Ihrer Unterklasse machen möchten. Der einfachste Weg, die Shell Ihrer Unterklasse zu erstellen, wäre, File > New File auszuwählen und dann Objective-C class zu wählen, wie bei jeder anderen Klasse, die eine neue Klasse mit Header- und Implementierungsdateien erstellt, die von NSObject erbt. Dann können Sie einfach die Zeile in der Header-Datei ändern:

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

zu

@interface MyClass : NSOutlineView { 

die Ihre Klasse von NSOutlineView erben verursachen. Da es sich um eine Unterklasse von NSOutlineView handelt, haben Sie viele Möglichkeiten, das Standardverhalten des Steuerelements zu ändern.

Da Sie eine Unterklasse erstellen, können Sie die Standardimplementierung eines Verfahrens ändern sich der Objektbaum - das heißt, Sie in NSOutlineView deklarierten Methoden außer Kraft setzen können, NSTableView, NSControl, NSView, NSResponder und NSObject (obwohl Sie sollten selten Methoden überschreiben, die in NSObject deklariert wurden). Sie müssen die Methodensignatur in Ihrer Headerdatei nicht neu definieren. Sie können die Funktion einfach überschreiben, indem Sie sie in der Implementierung Ihrer Unterklasse implementieren. Zum Beispiel würde, wenn Sie drawRect: Methode s NSView‘außer Kraft zu setzen, wollten Sie die folgenden bei der Umsetzung Ihrer Unterklasse von:

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

Wenn drawRect: auf Ihrer Klasse aufgerufen wird, wird der Code anstelle des Codes in NSView ausgeführt werden .

Sie können auch Methoden aufrufen, um die Struktur für Methoden aufzurufen, die Sie nicht behandeln möchten. Dies geschieht standardmäßig, sodass Sie keine leeren Methoden erstellen müssen, die die Methode einfach auf super aufrufen. Wenn Sie jedoch eine Methode überschreiben und einer Ihrer Superklassen erlauben möchten, diese zuerst zu behandeln, können Sie Folgendes tun:

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

    //Your code here 
} 

wäre dieser Vorteil, wenn Sie eine Variable in der Klasse, zum Beispiel, aber bieten die Standardimplementierung des Verfahrens, indem zuerst vorbei die Methode aufrufen, den Baum ändern wollte.

Subclassing kann ein ziemlich komplexer Prozess sein, besonders für solch ein komplexes Objekt wie eine Kontrolle, obwohl es sehr nützlich und leistungsfähig sein kann.

+0

Wow! Vielen Dank für diese großartige Antwort! Ich habe den Code eingefügt, den ich verwenden möchte, aber ich bekomme einen Fehler mit dem Code, den ich verwendet habe, ich habe mich gefragt, ob Sie mir helfen könnten, das Problem zu lösen. Hier ist der Code. http://fwdr.org/w3cr. Das Problem, das ich habe, ist, dass ich eine Fehlermeldung bekomme, dass 'rowIndex' nicht deklariert ist, aber ich weiß nicht, was ich deklarieren soll (ich meine, ob es ein NSArray ist etc.) . Ich fragte mich, ob Sie mir helfen könnten, weil ich sah, dass ich NSOutlineView von vornherein ableiten musste. Danke nochmal für die tolle Antwort. Und entschuldige mich für diesen langen Kommentar. – Joshua

+0

Das war, was ich zu Beginn meiner Post sagen wollte - wenn Sie in der Dokumentation, outlineView schauen: WillDisplayCell: forTableColumn: item: ist eine Delegate-Methode; Wenn Sie diese Methode nur überschreiben möchten, müssen Sie NSOutlineView nicht von der Unterklasse trennen. Sie können Ihre Controller-Klasse einfach zu einem Delegaten Ihrer NSOutlineView machen und diese Methode dort implementieren. Wie bei Ihrem Beispiel möchten Sie rowForItem aufrufen: In der Gliederungsansicht übergeben Sie anItem als Argument, um den Zeilenindex abzurufen. –

+0

Der Grund, warum ich versuche, NSOutlineView zu unterteilen, ist, weil es gesagt hat, wo ich den Code bekommen habe (http://www.cocoadev.com/index.pl?AlternatingRowColors) – Joshua

3

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

+0

Oh ich sehe, was würde ich setzen, wo die Punkte sind? – Joshua

+0

Oh, ich habe meinen Code dort. Würde ich irgendetwas in die Header-Datei schreiben müssen? – Joshua

+0

Das ist, was in der Header-Datei geht; das erste '...' ist zum Beispiel Variablen, das zweite für Methodensignaturen. Die .m enthält die @implementation MyOutlineView ... @ end' mit Ihrer tatsächlichen Methode ... Implementierungen. –