Гетерогенный 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 для проверки этого атрибута в подклассных методах. Если ваш объект не имеет атрибута, то пусть контроллер дерева суперкласса обрабатывает его, иначе ваше измененное поведение.

Другие вопросы по тегам