Контекст
У меня есть 2 столбца, основанный на ячейке NSTableView, управляемый NSArrayController.
- Первый столбец заполнен флажками, чтобы указать, включено ли значение.
- Второй столбец представляет имя элемента.
Представление связано с NSSearchField, поэтому фильтруется на основе предиката, который сравнивает строку поиска со строками в столбце 2.
Представление отображается правильно и фильтрует, как предполагалось, при изменении строки поиска.
Требование
Мне нужно разрешить пользователям включать не более 5 строк. Для этого я отслеживаю резервный массив на наличие изменений и отслеживаю количество включенных записей. Если количество превышает 5, я сообщаю пользователям предупреждение и отменяю выбор ранее включенной записи, получая выбранный индекс строки, а затем отключая этот индекс в резервном массиве. Я делаю это в блоке [willChange.. ..didChange] KVO.
Это работает, как предполагалось, когда представление не отсортировано, но, очевидно, вызывает проблемы, когда это так, потому что выбранная строка больше не соответствует соответствующему индексу в массиве.
Поэтому я использую следующий код, чтобы получить строковое значение выбранной ячейки, если представление отфильтровано (строка поиска не пуста). Затем я просматриваю массив и отключаю запись, соответствующую строке.
NSInteger selectedRow = [_tv_TableView selectedRow];
NSTableColumn* column= [_tv_TableView tableColumns][1];
NSCell* cell = [column dataCellForRow:row];
NSString* cellValue = (NSString*)[cell stringValue];
return cellValue;
Эта проблема
Хотя выбранная строка всегда точна, получение значения из репрезентативной ячейки — нет. Похоже, что изначально возвращаемое значение правильное, но затем при выборе других строк возвращаются данные из следующей строки, даже если выбранный индекс все еще правильный. Я также наблюдал, как он возвращает значения из нескольких строк вниз в представлении.
Обновлять
После дальнейшего тестирования выяснилось, что при первом применении фильтра он будет работать, но фильтрация по другой строке сохраняет значение ячейки первой выбранной ячейки для этого конкретного колебания.
i.e:
- Загрузить окно и выбрать 6 предметов
- Выбор 6-го элемента отменен, и пользователь предупрежден
- Применить фильтр
- Выберите новый 6-й элемент
- Выбор 6-го элемента отменен, и пользователь предупрежден
- Выберите другой 6-й элемент в том же фильтре
- Выбор 6-го элемента отменен, и пользователь предупрежден
- Введите новый фильтр
- Выберите новый 6-й элемент
- Выбор 6-го элемента отменен, и пользователь предупрежден
- Выберите новый 6-й элемент из того же фильтра
- Выбранный индекс правильный, но значение для выбранной строки совпадает с предыдущим выбором
- Пользователь неоднократно предупреждался, потому что правильная запись не отменяется, что приводит к 6 постоянно выбранным записям.
Однако по-прежнему бывают случаи, когда возвращается следующее значение строки, не являющееся ранее выбранным элементом.
Вопрос
Мои вопросы:
- Правильно ли я получаю выбранную строку для отфильтрованного списка?
- Как я могу постоянно получать строковое значение столбца 2 на основе выбранной строки, даже если список отсортирован?
Спасибо за уделенное время.
Решение
Я решил это, изменив код, который получает ячейку из:
NSInteger selectedRow = [_tv_TableView selectedRow];
NSTableColumn* column= [_tv_TableView tableColumns][1];
NSCell* cell = [column dataCellForRow:row];
NSString* cellValue = (NSString*)[cell stringValue];
return cellValue;
To:
NSCell* cell = [_tv_TableView preparedCellAtColumn:1 row:row];
NSString* cellValue = (NSString*)[cell stringValue];
return cellValue;