2013-08-30 19 views
9

Mam prostą aplikację, która zawiera listę modeli w NSTableView.Programowe dodawanie kolumn (z powiązaniami) do opartego na widoku NSTableView?

Tabela jest całkowicie standardową, opartą na widoku tabelą z kilkoma kolumnami i jest wypełniana przez NSArrayController za pomocą powiązań. Wszystko to jest skonfigurowane w Interface Builder i działa zgodnie z oczekiwaniami.

Teraz chciałbym dodać programowo więcej kolumn, a te nowe kolumny będą wiązały się z różnymi klawiszami w modelach. I tam utknąłem.

Dla uproszczenia przyjmijmy, że to ustawienie:

  1. Przedmiotem modelu są jasne obiekty z tylko jednej nieruchomości NSString: name
  2. AppDelegate ma właściwość NSArray (models) posiadająca numer modelu instancje.
  3. Urządzenie NSArrayController's content jest przypisane do macierzy delegata aplikacji models.
  4. NSTableView's content jest związany z arrangedObjects kontrolera macierzy.
  5. tabeli w pierwszej kolumnie jest związana (w IB), aby wyświetlić właściwość name, czyli kolumna → komórka tabeli Widok → tekst statyczny widok tabeli komórka → wartość jest zobowiązany do widoku komórka tabeli na objectValue.name

Jest to, o ile wiem, proste i zgodne z książką, i działa jak urok.

Ale ... jak dodać więcej kolumn?

Aby dodać kolumny programowo (keep it simple, powiedzmy, ta nowa kolumna powinna również prostu wyświetlić właściwość name, podobnie jak kolumny, która już tam jest), wyobrażam sobie, że zrobię coś takiego w Aplikacja pełnomocnik:

NSTableColumn* newColumn = [[NSTableColumn alloc] initWithIdentifier:@"newColumn"]; 

// do binding magic somehow 
// [[newColumn dataCell] bind:NSValueBinding toObject:??? withKeyPath:??? options:nil]; 

[self.table addColumn:newColumn]; // the table's connected with an IBOutlet 

próbowałem wiele kombinacji wiązania z/na komórce danych, w tabeli w kolumnie, sterownik tablicowy sama tablica, jak również wszelkiego rodzaju keypaths, ale nic nie działa. Nowa kolumna została dodana poprawnie, ale nigdy nie jest wypełniona.

Wyobrażam sobie, że podstawowa instancja NSTableColumn, którą utworzę, jest oparta na komórkach, a nie na widoku i powoduje problemy. Jednak nie mam pojęcia, jak przejść dalej, a doktorzy nigdy nie mówią o wiążących kolumnach, które zostały dodane programowo.

W tym przypadku wszystko, czego chcę, to prosta kolumna tekstowa, powiązana z modelem, dokładnie taka, jak ta, którą mogę łatwo skonfigurować IB.

Mogłem to wszystko zrobić, wprowadzając NSTableViewDataSource i "ręcznie" karmienie stołu, ale mam już wszystko inne skonfigurowane z wiązaniami.

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

4

Spróbuj tak: -

NSString *akey = @"keyValue"; 
NSString *keypath = [NSString stringWithFormat:@"arrangedObjects.%@",akey]; 
NSTableColumn *tableColumn=[[NSTableColumn alloc]initWithIdentifier:@"newColumn"]; 

[tableView addTableColumn:tableColumn]; 
[tableColumn bind:NSValueBinding toObject:yourArrayController withKeyPath:keypath options:nil]; 
NSMutableDictionary *dc=[NSMutableDictionary dictionary]; 
[dc setObject:@"textValue" forKey:@"keyValue"]; 
[yourmutableArray addObject:dc]; 
[self setYourmutableArray:yourmutableArray]; 

Uwaga: - Twój zmienny tablica powinna wiązać się arraycontroller wtedy tylko będzie wypełnić dane

+0

Niestety, nie działa; spróbował tego. Wiązanie kolumny działa tylko dla tabel opartych na komórkach. Nie tabele oparte na widoku. – Flambino

2

trzeba związać się z subviews z NSTableCellView kolumny z zastosowaniem tego metoda delegat:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 
{ 
    // Get cell view - NSTableCellView 
    // This can be a prototype loaded from the table view or from another nib 
    // see : - registerNib:forIdentifier: 
    NSView *cellView = [tableView makeViewWithIdentifier:@"Cell1" owner:[tableView delegate]]; 

    // - subViewWithIdentifier is a simple category method that searches -subviews 
    NSView *subView = [cellView subViewWithIdentifier:@"TextField1"]; 
    [subView bind: NSValueBinding toObject:cellView withKeyPath: @"objectValue.name" options: nil]; 

    subView = [cellView subViewWithIdentifier:@"TextField2"]; 
    [subView bind: NSValueBinding toObject:cellView withKeyPath: @"objectValue.address" options: nil]; 

    return cellView; 
} 

metoda kategoria NSView:

- (NSView *)subViewWithIdentifier:(NSString *)theIdentifier 
{ 
    __block NSView *subView = nil; 
    [[self subviews] enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
#pragma unused(idx) 
     if ([[obj identifier] isEqualToString:theIdentifier]) { 
      subView = obj; 
      *stop = YES; 
     } 
    }]; 
    return subView; 
} 
Powiązane problemy