Каковы причины для подкласса 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*"];
}