Каковы причины для создания подкласса NSArrayController? - PullRequest
15 голосов
/ 03 апреля 2011

Я пытаюсь улучшить свой KVC / KVO / Cocoa-Bindings-fu, и мне было интересно, что может быть причиной для подкласса NSArrayController?

Ответы [ 5 ]

17 голосов
/ 07 мая 2011

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

  • Иногда некоторые элементы должны быть скрыты, а некоторые должны отображаться
  • Я выполняю пользовательскую сортировку (т.е. группирование) в контроллере
  • Он подается элементами другого вида, чем он возвращает (получает элементы, возвращает узлы элементов - фиктивные объекты, которые пересылают большую часть материала)
  • Я также использую его для хранения критериев фильтра и параметров поиска, отображаемых в данный момент.
  • Кроме того, я добавил поддержку делегата и источника данных NSTableView, которая позволяет реализовывать перетаскивание прямо в контроллере
  • Я также настраиваю подсказки для ячейки там

Да и так далее.По сути, все сводится к этой сути: подкласс NSArrayController, если вы хотите, чтобы данные отличались от введенных в

Макс

9 голосов
/ 03 апреля 2011

Одна вещь, которую мне нравится делать при использовании контроллера массива с табличным представлением, - переопределить add:, чтобы опубликовать уведомление, чтобы новый элемент был выбран и сразу открыт для редактирования.Я на самом деле опубликовал это на CocoaDev некоторое время назад:

// Subclass of NSArrayController

- (void)awakeFromNib
{
    [[NSNotificationCenter defaultCenter] addObserver: self 
                                             selector: @selector(objectAdded:) 
                                                 name: @"Object Added" 
                                               object: self]
}

- (void)add: (id)sender
{
    [super add: sender]
    NSNotification * note = [NSNotification 
                                notificationWithName: @"Object Added" 
                                              object: self]
    // The add method doesn't really take effect until this run loop ends,
    // (see NSArrayController docs) so the notification needs 
    // to wait to post. Thus, enqueue with NSPostWhenIdle
    [[NSNotificationQueue defaultQueue] enqueueNotification: note
                                               postingStyle: NSPostWhenIdle]
}

- (void)objectAdded: (NSNotification *)note
{
    // when the notification finally arrives, tell the table to edit
    [[self contentTable] editColumn:0 
                                    row:[self selectionIndex] 
                              withEvent:nil 
                                 select:YES]
}

Конечно, можно сделать то же самое с контроллером, который не является подклассом NSArrayController;это только первый способ, который я понял.

1 голос
/ 06 апреля 2011

У меня есть приложение, которому нужно установить скрытое имя файла, когда пользователь добавляет объект - метод add в пользовательском классе ArrayController - это просто место для этого.

Edit - на самом деле, повторночитая мой Hillegas, лучше переопределить newObject.Это все еще требует подкласса NSArrayController все же.

0 голосов
/ 05 июня 2014

Я использую подкласс NSArrayController, чтобы назвать действия «Отменить / Повторить» для добавления и удаления объектов в моем приложении Core Data.
(Это была не моя идея, заслуга пользователя @ MikeD кто ответил на мой вопрос по этому вопросу .)

Переопределите метод - newObject.

- (id)newObject
{
    id newObj = [super newObject];

    NSUndoManager *undoManager = [[[NSApp delegate] window] undoManager];
    [undoManager setActionName:@"Add *insert custom name*"];

    return newObj;
}

Также метод - remove:sender.

- (void)remove:(id)sender
{
    [super remove:sender];

    NSUndoManager *undoManager = [[[NSApp delegate] window] undoManager];
    [undoManager setActionName:@"Remove *insert custom name*"];
}
0 голосов
/ 28 июня 2013

Я подклассифицировал контроллер массива для возврата нужного объекта при вызове - (id) newObject;

Обычно у вас есть файл .h & .m для каждого класса в вашем проекте, и контроллер массива создает определенный объект на основе имени класса, читая эти файлы.

Но если у вас есть только один файл .h .m или класс (например, Entity), который может вернуть любой объект (например, сотрудник, клиент, прочитав сохраненные модальные определения) на основе вашей потребности, вы должны создать подкласс arraycontroller потому что имя класса остается тем же (Entity), нужен ли вам объект сотрудника или объект клиента.

...