При использовании NSSearchField вторичный NSTableView теряет фокус и не обновляется одновременно

Я использую привязку основных данных в приложении какао. В моем приложении есть три NSTableView, привязанные к там NSArrayControllers во взаимосвязи, так что, если выбрана первая таблица, соответствующие данные, использующие взаимосвязь основных данных, отображаются в двух других таблицах.

Я подключил NSSearchField к первому NSArrayController. Проблема в том, что когда начинается поиск, две другие таблицы не синхронизируются с первой и вообще ничего не показывают.

В двух других таблицах содержимое отображается только в том случае, если первая из них нажата пользователем. Как я могу одновременно обновить все три NSTables при поиске?


person Khundragpan    schedule 16.02.2016    source источник
comment
Попробуйте повсюду опцию постоянно обновлять значение.   -  person stevesliva    schedule 16.02.2016
comment
@stevesliva, по-прежнему не обновляется даже после непрерывного обновления значения, выбранного для всех NSTable.   -  person Khundragpan    schedule 17.02.2016
comment
Ключевым будет поле поиска ... но я не уверен, что это действительно решение, просто попробуйте, поэтому просто комментарий. Удачи. +1.   -  person stevesliva    schedule 17.02.2016
comment
Включите «Избегать пустого выделения» контроллера массива первого табличного представления.   -  person Willeke    schedule 18.02.2016
comment
@Willeke, "Избегать пустого выделения" по умолчанию включено.   -  person Khundragpan    schedule 18.02.2016


Ответы (1)


Итак, у меня есть это решение, которое работает, я хотел бы знать, можно ли его улучшить.

Поскольку при запуске поиска первый выбор NSTableView теряется, а следовательно, и связанные таблицы, хотя таблица обновляется правильно, показывая отфильтрованное значение. Я устанавливаю себя в качестве наблюдателя за изменениями NSArrayController selectedObject.

-(void)awakeFromNib{
[super awakeFromNib];
[_firstArrayController addObserver:self forKeyPath:@"selectedObjects" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:NULL];
}

Теперь я наблюдаю за изменениями, и если выбранный объект действительно изменяется, и если NSSearchField - это тот, который меняет его, программно выберите первую строку NSTableView

    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)
object change:(NSDictionary *)change context:(void *)context
{
    NSResponder *firstResponder = [[NSApp keyWindow] firstResponder];
if ([firstResponder isKindOfClass:[NSText class]] && [(id)firstResponder delegate] == _searchField) {
    NSIndexSet *indexSet = [NSIndexSet indexSetWithIndex:0];
    [_authorTable selectRowIndexes:indexSet byExtendingSelection:NO];
}
}

Поскольку при фильтрации с использованием NSSearchField первый объект является наиболее важным, поэтому я устанавливаю выделение в строку 0.

person Khundragpan    schedule 17.02.2016