Автовыбор, фокус и выделение новой строки NSOutlineView

Вероятно, это просто недостаток опыта работы с 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, чтобы отредактировать ее, теперь она будет выглядеть так: введите описание изображения здесь

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


person coneybeare    schedule 18.02.2011    source источник


Ответы (1)


Что-то вроде этого работает для меня:

- (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.

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

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

person Nicholas Riley    schedule 19.02.2011
comment
Это работает, но без синего кольца фокусировки вокруг текстового поля: cloud.coneybeare.net/453z3V2A3s2P1j0T1V0L - person coneybeare; 19.02.2011
comment
Да, это часть о том, что виноват какой-то другой фрагмент кода. То, что вы делаете, работает изолированно. - person Nicholas Riley; 19.02.2011