NSTableView перескакивает при выборе… почему?

У меня есть NSTableView с одним столбцом, заполненным методами NSTableViewDataSource (без привязок). NSTableView находится внутри NSScrollView, как и поведение по умолчанию, когда вы перетаскиваете NSTableView из библиотеки в Interface Builder. Содержимое табличного представления заполняется на основе вводимой пользователем строки поиска и не изменяется после этого момента.

Я реализую только эти два метода протокола DataSource:

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView;
- (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row;

После ввода строки поиска фокус все еще находится в NSTextField, но я могу, естественно, прокручивать табличное представление колесом прокрутки мыши или стрелками на полосе прокрутки. Ни то, ни другое не заставляет табличное представление получать кольцо фокусировки. Однако, если я прокручиваю вниз так, что я не нахожусь в верхней части табличного представления, а затем щелкаю, чтобы выделить отдельную строку в табличном представлении, табличное представление вместо этого перескакивает обратно наверх, а затем выбирает любую строку, которая находится под моей мышью в этот момент . Если я нажимаю на строки после этого момента, все работает, как ожидалось.

Другими словами, если вокруг NSTableView есть кольцо фокусировки, щелчок по строке выделяет ожидаемую строку. Если вокруг него нет кольца фокусировки, щелчок по строке выбирает любую строку, которая находится в этой позиции после прокрутки вверх.

Любое понимание? Я бегаю со Snow Leopard, но, думаю, это случилось и с Leopard.


person BJ Homer    schedule 18.08.2010    source источник


Ответы (2)


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

person ig2r    schedule 18.08.2010
comment
О ... ты абсолютно прав! У меня было текстовое поле, установленное на «Отправить при окончании редактирования» вместо «Отправлять только при вводе». В результате, когда я щелкнул по табличному представлению, он снова запустил поиск. Если я перешел к кнопке «Поиск» перед тем, как щелкнуть по таблице, все заработало, как ожидалось. Спасибо! - person BJ Homer; 18.08.2010

Однажды у меня была похожая ошибка, и причина заключалась в том, что мой оконный контроллер обрабатывал awakeFromNib и устанавливал позицию прокрутки в списке, чтобы он находился в правильном положении при первой загрузке. Однако в конце концов я понял, что он также получал сообщения awakeFromNib от ячеек представления таблицы на основе пера, которые создаются по мере необходимости, что иногда неожиданно искажало значение прокрутки таблицы во время прокрутки. Мое исправление заключалось в том, чтобы оконный контроллер устанавливал только положение прокрутки при обработке первого awakeFromNib.

person w0mbat    schedule 02.08.2015