2012-06-06 2 views
18

У меня есть представление, основанное на nstableview. Я хочу, чтобы цвет всей строки на основе некоторых Condtion, для которых я использовал код нижеРаскраски строк в представлении на основе NSTableview

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

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

метод делегата называется, но, кажется, таблица не использует NSTableRowView возвращенный метод делегата.

Основная цель - раскрасить целую строку на основе некоторого состояния. Что не так в реализации?

+0

Чтобы установить BackgroundColor, вам нужно использовать '- (Недействительными) Tableview: (NSTableView *) Tableview didAddRowView: (NSTableRowView *) rowView forRow: (NSInteger) строку в вашем NSTableViewDelegate.' Смотрите мой более подробный ответ ниже. – DPlusV

ответ

0

Если вы смотрите презентацию на основе таблиц на основе WWDC 2011, вы увидите, что основная идея - создать представления в Interface Builder, а затем получить их оттуда. Что-то вроде:

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

Как только вы получили представление, просто установите его свойства и верните его.

Обратите внимание, что в этом примере у него есть свой собственный идентификатор, поэтому не забудьте установить его, но вы также можете использовать автоматические идентификаторы.

Я не знаю, будет ли работать прямая ссылка на WWDC, но главная страница здесь: https://developer.apple.com/videos/wwdc/2011/, и если вы ищите «View Based NSTableView Basic to Advanced», вы найдете его. Это стоит посмотреть.

+0

Я буду использовать привязки для заполнения данных в строке – sach

+0

Да .. Я хочу использовать вид на основе – sach

1

Наконец он работал ниже

- (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; 
    } 

Пожалуйста, обратите внимание .. и нужно конвертировать nscolor в cgcolor, которые вы можете найти в https://gist.github.com/707921 или http://forrst.com/posts/CGColor_Additions_for_NSColor-1eW

+3

Этот подход является хаком - он устанавливает индивидуальные представления ячеек на уровне хостинга (что не всегда то, что вы хотите), и он не меняет стиль всей строки. См. Мой ответ на этой странице для документированного подхода. – DPlusV

36

Для кого-то, кто бьет этого и хочет обычай NSTableRowView backgroundColor, есть два подхода.

  1. Если вам не нужен пользовательский рисунок, просто установите rowView.backgroundColor в - (void)tableView:(NSTableView *)tableView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row в вашем NSTableViewDelegate.

    Пример:

    - (void)tableView:(NSTableView *)tableView 
        didAddRowView:(NSTableRowView *)rowView 
          forRow:(NSInteger)row { 
    
        rowView.backgroundColor = [NSColor redColor]; 
    
    } 
    
  2. Если вам нужен пользовательский рисунок, создать свой собственный NSTableRowView подкласс с желаемым drawRect. Затем осуществить следующее в NSTableViewDelegate:

    Пример:

    - (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

Это работает, если вы используете табличный вид на ячейке? У меня такое впечатление, что нет, но я просто хотел проверить. – Kyle

+1

Вы мое время Saver! Благодарим вас за то, как использовать делегат rowViewForRow. – Tommy

+2

Спасибо! Это сработало отлично. Прежде чем я нашел это, я немного смутился о том, как добавить свою подклассовую строку, но это творит чудеса. –

0

я переписал подход слоя. В 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 

} 

Не забудьте изменить идентификатор ячейки в соответствии с раскадровку, и в БИК «зеленых». И, конечно, цвет фона, если хотите.

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