Автовыбор, фокус и выделение новой строки NSOutlineView - PullRequest
0 голосов
/ 19 февраля 2011

Вероятно, это просто недостаток опыта с NSOutlineView, но я не могу найти способ сделать это.У меня есть NSOutlineView (реализованный с превосходным PXSourceList ) с кнопкой добавления, которая полностью функциональна в том смысле, что я правильно сохраняю / пишу / вставляю / удаляю строки.Я не использую NSTreeController и не использую привязки.Я добавляю сущность, используя следующий код:

- (void)addEntity:(NSNotification *)notification {
    // Create the core data representation, and add it as a child to the parent node
    UABaseNode *node = [[UAModelController defaultModelController] createBaseNode];
    [sourceList reloadData];
    for (int i = 0; i < [sourceList numberOfRows]; i++) {
        if (node == [sourceList itemAtRow:i]) {
            [sourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:i] byExtendingSelection:NO];
            [sourceList editColumn:0 row:i withEvent:nil select:NO];
            break;
        }
    }
}

Когда нажата кнопка добавления, новая строка вставляется следующим образом:

enter image description here

Если ящелкните, затем выберите строку и нажмите enter, чтобы отредактировать ее, теперь она выглядит следующим образом: enter image description here

Мой вопрос: Как программно получить такое же состояние (фокус, выбрано, выделено) в первый раз, чтобы сделать пользовательский опыт лучше?

1 Ответ

1 голос
/ 19 февраля 2011

Как-то так у меня работает:

- (void)addEntity:(NSNotification *)notification {
    // Create the core data representation, and add it as a child to the parent node
    UABaseNode *node = [[UAModelController defaultModelController] createBaseNode];
    [sourceList noteNumberOfRowsChanged];
    NSInteger row = [sourceList rowForItem:node];
    [sourceList scrollRowToVisible:row];
    [sourceList selectRowIndexes:[NSIndexSet indexSetWithIndex:row] byExtendingSelection:NO];
    [sourceList editColumn:0 row:row withEvent:nil select:YES];
}

Вы можете использовать rowForItem: вместо многократной проверки itemAtRow:.

Как правило, вы также хотите использовать [sourceList scrollRowToVisible:...] в случае, если новая строка не видна и вы можете использовать noteNumberOfRowsChanged вместо reloadData, если только данные не изменились.

Стандартное поведение Mac - выбор содержимого вновь созданного элемента, поэтому используйте select:YES.

Если это не поможет, в вашем коде происходит что-то еще, что приведенный выше фрагмент не сообщает ...

В общем, я бы действительно рекомендовал при изучении нового класса читать всю страницу на странице документации со списком доступных методов (исключая устаревшие методы) или, по крайней мере, все методы, доступные для задачи, которую вы пытаешься выполнить; вы получите гораздо лучшее представление о возможностях этого класса и с меньшей вероятностью будете использовать неуместный / неэффективный / неэффективный метод.

...