2009-06-14 3 views
-7

Как бы вы подклассифицировали NSOutlineView?Подкласс NSOutlineView

+3

Короткий ответ: так же, как и подкласс любого объекта. Вы должны попробовать и уточнить свои вопросы. Документация Apple охватывает подклассификацию, поэтому мы должны предположить, что вы ее прочитали и что-то пробовали, а затем застряли. Где ты застрял? –

+0

Извините, я не читал все документы Apple по подклассификации. – Joshua

ответ

14

Во-первых, перед тем, как подкласс объекта, вы должны спросить себя: «мне нужно сделать это?». Подкласс - это более сложный способ взаимодействия и расширения функциональности других классов, поэтому вы должны убедиться, что то, чего вы пытаетесь достичь, не может быть легко достигнуто с помощью другого, более простого метода, такого как делегирование, уведомления и т. Д. Очевидно, что если вы пытаетесь чтобы изменить внешний вид элемента управления, это будет легче выполнить с помощью подкласса, но убедитесь, что вы проверяете все другие доступные параметры. Помните, что NSOutlineView имеет довольно длинное дерево объектов - он наследует от NSTableView, который наследует от NSControl, который наследует от NSView, который наследует от NSResponder, который наследует от NSObject, и существуют различные вспомогательные методы, которые существуют в каждом из этих классов, которые могут часто поможет вам достичь того, чего вы хотите.

Однако, если вы проверите все эти параметры и решите подкласс NSOutlineView, это зависит от того, что вы хотите сделать с вашим подклассом. Самый простой способ создать оболочку вашего подкласса - выбрать File > New File, а затем выбрать Objective-C class, как и любой другой класс, который создаст новый класс с заголовками и файлами реализации, который наследует от NSObject. Тогда вы можете просто изменить строку в файле заголовка:

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

в

@interface MyClass : NSOutlineView { 

, который заставит ваш класс наследовать от NSOutlineView. Поскольку это подкласс NSOutlineView, это дает вам множество возможностей изменить поведение элемента управления по умолчанию.

Поскольку вы создаете подкласс, вы можете изменить реализацию по умолчанию любого метода до объекта дерева - то есть, вы можете переопределить методы, объявленные в NSOutlineView, NSTableView, NSControl, NSView, NSResponder и NSObject (хотя вы должны редко методы переопределения, объявленные в NSObject). Вам не нужно переопределять подпись метода в вашем заголовочном файле, вы можете просто переопределить функцию, реализовав ее в реализации вашего подкласса. Например, если вы хотите, чтобы переопределить drawRect: метод NSView «с, вы могли бы сделать следующее в реализации вашего подкласса:

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

Когда drawRect: призывается ваш класс, ваш код будет выполняться вместо кода в NSView ,

Вы также можете передать метод, вызывающий дерево для методов, которые вы не хотите обрабатывать. Это делается по умолчанию, поэтому вам не нужно создавать пустые методы, которые просто вызывают метод на super, однако, если вы переопределите метод и хотите разрешить одному из ваших суперклассов обрабатывать его, вы можете сделать следующее:

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

    //Your code here 
} 

Это было бы полезно, если бы вы хотели изменить переменную в своем классе, например, но предоставить стандартную реализацию метода, сначала передав метод вызову дерева.

Подкласс может быть довольно сложным процессом, особенно для такого сложного объекта, как элемент управления, хотя он может быть очень полезным и мощным.

+0

Вау! Большое спасибо за этот отличный ответ! Я поставил код в том, что я хочу использовать, но, я получаю сообщение об ошибке с кодом, который я использовал, мне было интересно, поможете ли вы мне решить проблему. Вот код. http://fwdr.org/w3cr. Проблема у меня в том, что я получаю сообщение об ошибке «rowIndex» не объявлен, но я не знаю, что объявить как (я имею в виду, является ли это NSArray и т. Д.), , Я задавался вопросом, можете ли вы помочь, видя, что именно поэтому мне пришлось подклассифицировать NSOutlineView в первую очередь. Еще раз спасибо за большой ответ. И извините за этот длинный комментарий. – Joshua

+0

Это то, что я пытался сказать в начале моего сообщения - если вы посмотрите в документах, outlineView: willDisplayCell: forTableColumn: item: - метод делегата; поэтому, если вы хотите только переопределить этот метод, вам не нужно подклассифицировать NSOutlineView; вы можете просто сделать свой класс контроллера делегатом вашего NSOutlineView, а затем реализовать этот метод там. Что касается вашего образца, вы хотите вызвать rowForItem: в виде контура, передавая anItem в качестве аргумента для извлечения индекса строки. –

+0

Причина, по которой я пытаюсь выполнить подкласс NSOutlineView, заключается в том, что он сказал, чтобы сделать это, откуда я получил код (http://www.cocoadev.com/index.pl?AlternatingRowColors) – Joshua

3

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

+0

О, я вижу, что бы я поставил там, где находятся точки? – Joshua

+0

О, я поставил там свой код. Нужно ли мне помещать что-либо в файл заголовка? – Joshua

+0

Вот что входит в файл заголовка; первая «...» - это, например, переменные, вторая для сигнатур методов. .m содержит '@implementation MyOutlineView ... @ end' с вашим фактическим методом ... реализациями. –

Смежные вопросы