2015-07-22 3 views
2

После поиска через SO и в Интернете я изо всех сил пытаюсь понять концепцию, которая, как я думал, будет относительно простой. По сути, у меня есть таблица в приложении OS X Swift с несколькими столбцами, и в настоящее время она заполняет данные. Я пытаюсь понять, как я могу установить цвет фона каждой «строки» (в идеале с чередующимися цветами, но я начну с одного цвета). Мой файл MasterViewController похож на этот;Настройка цвета фона NSTableCellView в Swift

import Cocoa 

class MasterViewController: NSViewController { 

var minions = [Minion]() 

func setupSampleMinion() { 
    minions = Minion.fetchMinionData() 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do view setup here. 
} 

} 

// MARK: - NSTableViewDataSource extension MasterViewController: NSTableViewDataSource { 
func numberOfRowsInTableView(aTableView: NSTableView) -> Int { 
    return self.minions.count 
} 

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

    // 1 
    var cellView: NSTableCellView = tableView.makeViewWithIdentifier(tableColumn!.identifier, owner: self) as! NSTableCellView 

    let minion = self.minions[row] 

    // 2 
    if tableColumn!.identifier == "MyColumn" { 
     // 3 

     cellView.imageView!.image = NSImage(named: "minion.name!") 
     cellView.textField!.stringValue = minion.name! 
     return cellView 
    } 

    return cellView 
} 
} 

func tableView(tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView? { 
let myCustomView = MyRowView() 
return myCustomView 
} 

class MyRowView: NSTableRowView { 

override func drawRect(dirtyRect: NSRect) { 
    super.drawRect(dirtyRect) 

    self.backgroundColor = NSColor(red: 0.76, green: 0.82, blue: 0.92, alpha: 1) 

    NSRectFill(dirtyRect) 


} 
} 

// MARK: - NSTableViewDelegate extension MasterViewController: NSTableViewDelegate { 
} 

Хотя я думаю, у меня есть некоторые права кодирования, это не похоже, чтобы установить цвет фона, если строка в любом случае. Любые мысли или общее руководство были бы наиболее оценены. Спасибо!

ответ

2

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

Чтобы использовать нестандартный цвет фона, вы хотите установить вид строки backgroundColor, но не внутри drawRect(). Если изменить свойство зрения, которые влияют как он рисует внутри drawRect(), что, вероятно, ознаменуют вид нуждающийся дисплея, который будет провоцировать другой вызов drawRect() и т.д.

Он должен работать, чтобы просто установить его в делегате tableView(_:didAddRowView:forRow:) способ. Это описано в описании свойства backgroundColor.

Что касается вашей попытки переопределить drawRect(): установка номера строки backgroundColor, вероятно, повлияет на то, как вытягивает суперкласс. Итак, установив его после, вызов в супер вряд ли поможет. Он определенно не повлияет на последующий вызов NSRectFill(). Эта функция зависит от цвета заливки, заданного для текущего графического контекста, который является неявным. Вы измените это, позвонив someColor.set().

Купите, в любом случае, не нужно переопределять drawRect(), учитывая, что вы можете установить backgroundColor. Если вы хотите добиться некоторого фонового рисунка за пределами того, что возможно, просто установив цвет, вы должны переопределить drawBackgroundInRect(), а не drawRect(), так или иначе.

Наконец, ваша реализация tableView(tableView:rowViewForRow:) должна сначала вызвать метод отображения таблицы makeViewWithIdentifier(_:owner:), прежде чем создавать новое представление. И он должен установить идентификатор на любом новом представлении, которое он создает. Это позволяет виду таблицы поддерживать очередь повторного использования представлений, чтобы избежать постоянного уничтожения и воссоздания представлений.

+0

Большое спасибо, Кен! Я закончил игру с файлом до вашего ответа и более или менее решил тот же вывод. При создании файла View Controller для вызова метода makeViewWithIdentifier (_: owner:) 'сначала была разрешена общая проблема. Я играю с реализацией 'drawRect()', но теперь понимаю. Спасибо! – ZbadhabitZ

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