У меня есть приложение, которое должно представлять множество данных по группам. Я положил меню выбора группы в угловое окно таблицы, чтобы позволить пользователю выбрать группу для просмотра.cocoa nstableview динамическое связывание - без IB
Столбцы этой таблицы имеют идентификаторы fld # 0..n и ассоциированный контроллер для извлечения данных. В целевом классе он будет - используя привязку IBOutlet к контроллеру представления, получить выбор группы и использовать ее для выбора через переключатель, какое значение для отображения.
Все было dandy, пока мне не понадобилось поддерживать несколько экземпляров вида/окна. Так что я думал, что буду во время работы, изменить? в таблице (-ах) и ее привязках. На сегодняшний день я только делал это через IB, так что это мой первый набег на внутренности и застревание.
Мое меню угол зрения действия (что пользователь вызывает):
- (NSMenu *)menuForEvent:(NSEvent *)event
{
NSMenu * menu = [[[NSMenu alloc] init] autorelease];
SEL action = @selector(cornerAction:);
NSMenuItem * item = nil;
int type = 0;
// We auto enable items as views present them
[menu setAutoenablesItems:YES];
// TableView level column customizations
for (NSString * title in titles)
{
BOOL state = dataView.data == type;
item = [[NSMenuItem alloc] initWithTitle:title
action:action
keyEquivalent:@""];
[item setRepresentedObject:dataView];
[item setState:state];
[item setEnabled:YES];
[item setTag:type++];
[item setTarget:dataView];
[item setAction:action];
[menu addItem:item];
[item release];
}
return menu;
}
, а затем действовал на - но не может, как мне нужно, чтобы выяснить, как обновить привязок:
- (IBAction)cornerAction:(id)sender
{
// Configure which type of data to show, then columns' identifier and sort
self.data = (self == sender ? 0 : [sender tag]);
[super cornerAction:sender];
for (NSUInteger itm=0; itm<self.fieldCount; itm++)
{
NSString * fld = [NSString stringWithFormat:@"fld%@%d", titles[data], itm];
NSString * key = [NSString stringWithFormat:@"srt%@%d", titles[data], itm];
NSSortDescriptor * srt = [NSSortDescriptor sortDescriptorWithKey:key ascending:YES];
[cols[itm] setIdentifier:fld];
[cols[itm] setSortDescriptorPrototype:srt];
[cols[itm] bind:<#(nonnull NSString *)#>
toObject:<#(nonnull id)#>
withKeyPath:<#(nonnull NSString *)#>
options:<#(nullable NSDictionary<NSString *,id> *)#>]
}
[self reloadArray:YES];
}
перевалы [ ] - массив столбцов таблицы, поэтому последняя строка является отправной точкой для обновления привязок для столбца к контроллеру (древовидному контроллеру) к правильным данным. Я обновил класс для удаления столбцов fld # namesholder и создал все варианты fld # и srt # ivars; они в основном возвращают основанный ivar. Наконец, весь доступ доступен только для чтения.
Я думал, что все, что мне нужно сделать, это обновить привязку. Я также чувствую, что, возможно, изменения столбца в идентификатор и дескриптор сортировки не нужны?
В любом случае я пытаюсь избежать плана-B, который должен прибегать к вкладкам, создавая представление о таблице в группе - yuck, или, может быть, есть лучший способ вообще?
ОБНОВЛЕНИЕ: Я по-прежнему предполагая, по плану-А не должна эта работа: идентификатор предполагают, колонка для перевалы [0] fld0
[cols[itm] bind: @"value"
toObject: treeController
withKeyPath: [NSString stringWithFormat:@"arrangedObjects.%@",fld]
options: nil]
Является ли представление вида таблицы основанным или основанным на ячейке? – Willeke
Обычно, если у вас есть таблица, привязанная к контроллеру, и вы хотите изменить то, что отображается в таблице, вы меняете содержимое контроллера ... вы не срываете привязки вида. И если вы хотите, чтобы другой набор данных был привязан и отображался по-разному, вам может потребоваться приблизиться к нему, динамически отображая другое представление, а не тот же вид с восстановленными привязками. – stevesliva
Итак, да, это похоже на повторное скремблирование яиц в омлет, поэтому используйте вкладку с вкладками из нескольких вкладок, которые, я думаю, это путь. – slashlos