Каковы причины для подкласса NSArrayController?

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

Ответы

Ответ 1

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

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

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

Max

Ответ 2

Одна вещь, которую мне нравится делать при использовании контроллера массива с табличным представлением, - это переопределить 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; это только первый способ, который я понял.

Ответ 3

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

Изменить - На самом деле, повторное чтение моих Hillegas, переопределение newObject - лучший способ. Тем не менее он по-прежнему требует подкласс NSArrayController.

Ответ 4

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

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

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

Ответ 5

Я использую подкласс NSArrayController для указания действий Undo/Redo для добавления и удаления объектов в приложении 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*"];
}