Можно ли связать выбор NSTableView с выбором другого табличного представления? - PullRequest
1 голос
/ 02 февраля 2011

Screenshot

Допустим, у меня есть 2 сущности в файле модели базовых данных, одна из которых является всеми "транзакциями", когда-либо совершенными компанией X. Объект «транзакции» имеет среди прочих свойств свойство «ДАТА» и отношение «КОМПАНИЯ» «один к одному» (указывающее компанию, с которой компания Х совершила эту конкретную транзакцию). Другая сущность: «компании», конечно, содержит всю информацию о компаниях, с которыми компания Х заключила сделку. У сущности "компании" есть множество "TRANSACTIONS", которое является обратной зависимостью от отношения "COMPANY" сущности "транзакции".

Таким образом, в IB я создал NSTableView (с его собственным NSArrayController), показывающий все транзакции на определенную дату (с помощью NSPredicate).

Затем я создаю другое табличное представление, показывающее отношение «многие» «СДЕЛКИ» компании выбранной транзакции в первом табличном представлении (которое показывает транзакции на определенную дату). Привязка NSArrayController во втором табличном представлении выглядит так:

** привязка к: «имя контроллера первого табличного представления», ключ контроллера: выбор, ключ модели Путь: COMPANY.TRANSACTIONS (отношение «ко-многим» в сущности «компании») **

До настоящего момента все работало нормально, во втором табличном представлении показаны все транзакции, которые компания X совершила с компанией из выбранных транзакций в первом табличном представлении.

Но у меня есть группа текстовых полей, показывающих детали определенных транзакций. Связать эти текстовые поля с контроллером 1-го табличного представления (в котором отображаются транзакции на определенную дату) довольно просто. Но я хочу сделать следующее: 1 / Просмотрите транзакции на определенную дату в первом табличном представлении, выберите любую из них 2 / Затем проверьте все предыдущие транзакции компании этой транзакции (выбранной в первом табличном представлении) из второго табличного представления. 3 / Выберите любые предыдущие транзакции и проверьте детали транзакции из этой группы текстовых полей

Поэтому, естественно, мне нужно было привязать gp текстовых полей к контроллеру 2-го табличного представления. Но я обнаружил, что выбранная по умолчанию строка во 2-м табличном представлении (в котором показаны все предыдущие транзакции компании) не была транзакцией, которую я выбрал в 1-м табличном представлении на определенную дату. Конечно, я могу вручную выбрать эту транзакцию во втором представлении таблицы ....

Так что я просто хочу знать, возможно ли, чтобы второе представление таблицы автоматически выбирало транзакцию в соответствии с транзакцией, которую я выбрал в первом представлении таблицы для привязки ??

После нескольких часов поиска в Google я решил проблему, реализовав протокол делегата tableview:

    - (void)tableViewSelectionDidChange:(NSNotification *)aNotification { 
if (["nameOf1stTableView" selectedRow] > -1) {
    NSArray *objsArray = ["nameOf2ndTableView'sController" arrangedObjects];
    for (id obj in objsArray) {
        if ([[obj valueForKey:@"DATE"] isEqualToDate: ["nameOf1stTableView'sController".selection valueForKey:@"DATE"]]) {
            ["nameOf2ndTableView" selectRowIndexes:[NSIndexSet indexSetWithIndex:[objsArray indexOfObject:obj]] byExtendingSelection:NO];
        }
    }
    }

}

Но это выглядит слишком громоздко ... это можно сделать только с помощью привязки?

1 Ответ

0 голосов
/ 13 сентября 2011

Добавьте временное свойство dateFilterPredicate к объекту модели Transaction, который предоставляет предикат, который выбирает связанные транзакции - те, которые вы хотите отобразить в табличном представлении # 2, когда этот экземпляр Transaction выбран в табличном представлении # 1.

Вам потребуется реализовать пользовательский установщик даты транзакции, чтобы обновить предикат при изменении даты транзакции объекта. Вам также нужно установить его в awakeFromFetch (что не вызывает setTransactionDate).

Затем связать привязку предиката фильтра контроллера массива 2 к selection контроллера массива 1, но вместо company.transactions использовать dateFilterPredicate.

...