Можно ли связать выбор NSTableView с выбором другого табличного представления?
Допустим, у меня есть две сущности в файле модели базовых данных, одна из которых - все "транзакции", когда-либо совершенные компанией X. Сущность "транзакции" имеет среди прочих свойств свойство "ДАТА" и отношение "КОМПАНИЯ" "один к одному" (указывающее компанию, с которой компания Х совершила эту конкретную транзакцию). Другая сущность:"компании", разумеется, содержит всю информацию о компаниях, с которой компания Х заключила сделку. Сущность "компании" имеет множество отношений "TRANSACTIONS", которые являются обратными отношениями к связи "COMPANY" сущности "транзакции".
Так что в IB я создал NSTableView
(со своим NSArrayController
) показывая все транзакции на определенную дату (с помощью NSPredicate
).
Затем я создаю другое табличное представление, показывающее отношение "ко-многим" "СДЕЛКИ" компании выбранной транзакции в первом табличном представлении (которое показывает транзакции на определенную дату). 2-й вид таблицы NSArrayController
привязка выглядит так:
** привязка к:"имя контроллера первого табличного представления", ключ контроллера: выбор, путь к ключу модели:COMPANY.TRANSACTIONS(отношение "ко-многим" в сущности "компании")**
До этого момента все работало нормально, во втором табличном представлении показаны все транзакции, которые компания X совершила с компанией из выбранных транзакций в первом табличном представлении.
Но у меня есть группа текстовых полей, показывающих детали конкретных транзакций. Связать эти текстовые поля с контроллером 1-го табличного представления (в котором отображаются транзакции на определенную дату) довольно просто. Но я хочу сделать следующее: 1/ Найти транзакции на определенную дату в первом табличном представлении, выбрать любую из них 2/ Затем проверить все предыдущие транзакции компании этой транзакции (выбранной в первом табличном представлении).) из 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 ответ
Добавить временное свойство dateFilterPredicate
к Transaction
объект модели, который предоставляет предикат, который выбирает связанные транзакции - те, которые вы хотите отобразить в табличном представлении № 2, когда этот экземпляр Transaction
выбран в табличном представлении #1.
Вам потребуется реализовать пользовательский установщик для даты транзакции, чтобы обновить предикат при изменении даты транзакции объекта. Вы также должны установить его в awakeFromFetch
(который не вызывает setTransactionDate
).
Затем привязка предиката фильтра массива контроллера 2 связывается с контроллером массива 1 selection
, но вместо company.transactions
использовать dateFilterPredicate
,