2012-06-06 11 views
18

Mam widok oparty na nstableview. Chcę pokolorować cały wiersz na podstawie jakiegoś condtion dla którego użyłem kodu poniżejKolorowanie wierszy w widoku opartym na widoku NSTableview

- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row 
{ 
    NSTableRowView *view = [[NSTableRowView alloc] initWithFrame:NSMakeRect(1, 1, 100, 50)]; 

    [view setBackgroundColor:[NSColor redColor]]; 
    return view;; 
} 

Sposób delegat nazywa, ale tabela nie wydaje się być za pomocą NSTableRowView zwrócony przez metodę delegata.

Głównym celem jest tu kolorowanie całego rzędu na podstawie pewnych warunków. Co jest źle w powyższej implementacji?

+0

Aby ustawić backgroundColor, trzeba użyć '- (void) tableView: (NSTableView *) tableView didAddRowView: (NSTableRowView *) rowView forRow: (NSInteger) wiersz w NSTableViewDelegate.' Zobacz moją bardziej szczegółową odpowiedź poniżej. – DPlusV

Odpowiedz

0

Jeśli obejrzysz prezentację na podstawie widoków wyświetlanych w widoku z WWDC 2011, zobaczysz, że główną ideą jest utworzenie widoków w Konstruktorze interfejsów, a następnie ich uzyskanie. Coś jak:

[tableView makeViewWithIdentifier:@"GroupRow" owner:self]; 

Po uzyskaniu widoku wystarczy ustawić jego właściwości i zwrócić.

Zauważ w tym przykładzie, że ma on swój własny identyfikator, więc pamiętaj, aby to ustawić, ale możesz również użyć automatycznych identyfikatorów.

Nie wiem, czy bezpośredni link do WWDC będzie działał, ale strona główna jest tutaj: https://developer.apple.com/videos/wwdc/2011/, a jeśli wyszukasz "Widok oparty na NSTableView Basic to Advanced", znajdziesz go. Warto to obejrzeć.

+0

Będę używał wiązań do zapełniania danych do wiersza – sach

+0

tak .. chcę użyć widoku opartego na – sach

1

Wreszcie to działało jak poniżej

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 

{ 
     NSView *cellView = (NSView*) [tableView makeViewWithIdentifier:[tableColumn identifier] owner:[tableView delegate]]; 
     CALayer *viewLayer = [CALayer layer]; 
     [viewLayer setBackgroundColor:[[NSColor redcolor] CGColor]]; 
     [cellView setWantsLayer:YES]; 
     [cellView setLayer:viewLayer]; 
     return cellView; 
    } 

Uwaga .. u trzeba konwertować nscolor do cgcolor które można znaleźć w https://gist.github.com/707921 lub http://forrst.com/posts/CGColor_Additions_for_NSColor-1eW

+3

To podejście jest hakowaniem - ustawia indywidualne widoki komórek na hosting warstw (co nie zawsze jest tym, czego potrzebujesz) i nie zmienia stylu całego wiersza. Zobacz moją odpowiedź na tej stronie dla udokumentowanego podejścia. – DPlusV

36

dla każdego, kto trafi to i chce zwyczaj NSTableRowView backgroundColor, istnieją dwa podejścia.

  1. Jeśli nie trzeba zwyczaj rysowania, wystarczy ustawić rowView.backgroundColor w - (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row w NSTableViewDelegate.

    Przykład:

    - (void)tableView:(NSTableView *)tableView 
        didAddRowView:(NSTableRowView *)rowView 
          forRow:(NSInteger)row { 
    
        rowView.backgroundColor = [NSColor redColor]; 
    
    } 
    
  2. Jeśli musisz zwyczaj rysowania, tworzenia własnego NSTableRowView podklasę z żądanym drawRect. Następnie, wykonuje się w następujący NSTableViewDelegate:

    przykład:

    - (NSTableRowView *)tableView:(NSTableView *)tableView 
           rowViewForRow:(NSInteger)row { 
        static NSString* const kRowIdentifier = @"RowView"; 
        MyRowViewSubclass* rowView = [tableView makeViewWithIdentifier:kRowIdentifier owner:self]; 
        if (!rowView) { 
         // Size doesn't matter, the table will set it 
         rowView = [[[MyRowViewSubclass alloc] initWithFrame:NSZeroRect] autorelease]; 
    
         // This seemingly magical line enables your view to be found 
         // next time "makeViewWithIdentifier" is called. 
         rowView.identifier = kRowIdentifier; 
        } 
    
        // Can customize properties here. Note that customizing 
        // 'backgroundColor' isn't going to work at this point since the table 
        // will reset it later. Use 'didAddRow' to customize if desired. 
    
        return rowView; 
    } 
    
+0

Czy to działa, jeśli używasz widoku tabeli opartego na komórce? Mam wrażenie, że tak nie jest, ale chciałem tylko zweryfikować. – Kyle

+1

Jesteś moim czasem Oszczędzającym! Dziękujemy za udostępnienie sposobu korzystania z delegata rowViewForRow. – Tommy

+2

Dzięki! To działało idealnie. Zanim znalazłem to byłem trochę zdezorientowany, jak dodać mój podklasowany wiersz, ale działa cuda. –

0

re scenariusza podejście warstwy. w Swift 3.2

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? { 

    let greenCell = self.tableview.make(withIdentifier: "green", owner: self) 
    let layer:CALayer = CALayer() 
    layer.backgroundColor = NSColor.green.cgColor 

    greenCell?.wantsLayer = true 
    greenCell?.layer = layer 

    return greenCell 

} 

Nie zapomnij zmienić identyfikator komórki w zależności od ujęć, aw identyfikatora kod „zielone”. I oczywiście kolor tła, jeśli chcesz.

Powiązane problemy