Гетерогенный NSTreeController
У меня есть NSTreeController (поставка контента для NSOutlineView). Мне бы хотелось, чтобы объекты верхнего уровня принадлежали одному классу, а все другие объекты (то есть дети любого уровня) принадлежали к другому. Какой лучший способ пойти по этому поводу?
Мне нужно как-то изменить поведение хотя бы add
, addChild
, insert
, а также insertChild
, Я полагаю. Однако я надеялся найти простой способ объяснить это только в одном месте, а не менять четыре отдельных метода.
2 ответа
Это сработало, и мне не пришлось переписывать какие-либо функции:
- (void)insertChild:(id)sender
{
if ([self selectionIndexPath])
{
[self setObjectClass:[IRGroup class]];
[super insertChild:sender];
}
else
{
[self setObjectClass:[IRFloor class]];
[super insertChild:sender];
}
}
Это было нелегко; Я пытался переопределить newObject
потому что документы Apple утверждают, что он вызывается при вставке братьев и сестер, но мои тесты показывают, что он вызывается только при вставке братьев и сестер.
Мне кажется, что вы можете просто создать атрибут в ваших объектах, чтобы различать, какие объекты должны использовать ваши измененные методы, а какие нет. Затем просто поместите простой оператор if для проверки этого атрибута в подклассных методах. Если ваш объект не имеет атрибута, то пусть контроллер дерева суперкласса обрабатывает его, иначе ваше измененное поведение.