2016-09-20 7 views
0

У меня есть приложение, которое должно представлять множество данных по группам. Я положил меню выбора группы в угловое окно таблицы, чтобы позволить пользователю выбрать группу для просмотра.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] 
+0

Является ли представление вида таблицы основанным или основанным на ячейке? – Willeke

+1

Обычно, если у вас есть таблица, привязанная к контроллеру, и вы хотите изменить то, что отображается в таблице, вы меняете содержимое контроллера ... вы не срываете привязки вида. И если вы хотите, чтобы другой набор данных был привязан и отображался по-разному, вам может потребоваться приблизиться к нему, динамически отображая другое представление, а не тот же вид с восстановленными привязками. – stevesliva

+0

Итак, да, это похоже на повторное скремблирование яиц в омлет, поэтому используйте вкладку с вкладками из нескольких вкладок, которые, я думаю, это путь. – slashlos

ответ

0

Из-за неявного кэширования/объекта клонирования самое простое решение было создать экземпляр табличный вид. Пользовательский интерфейс поддерживался согласованно, поэтому никаких видимых мне изменений не было, и это модель, идущая вперед для других аналогичных требований - как просматривать огромные объемы данных с помощью метафоры с одним объективом/таблицей.

 Смежные вопросы

  • Нет связанных вопросов^_^