NSTableViewCell setSelected?

Как мне установить связь между моим NSViewController и NSTableViewCell, когда я выбираю эту ячейку в своем tableView? В iOS вы можете использовать setSelected, но в OSX все по-другому. Класс NSTableCellView не имеет такой функции. Я мог упустить что-то простое. Как мне поговорить с этой ячейкой? У меня есть пользовательская ячейка класса, и на моем контроллере tableView я получил:

func tableView(tableView: NSTableView, shouldSelectRow row: Int) -> Bool {

    let previousSelected = NSIndexSet(index: selectedRow)
    selectedRow = row
    let indset = NSIndexSet(index: row)

    // animate row expansion
    self.tableView.noteHeightOfRowsWithIndexesChanged(indset)

    // animate back the previously selected
    self.tableView.noteHeightOfRowsWithIndexesChanged(previousSelected)
    return true
}

У меня также есть высота Row ...

func tableView(tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
    if row == selectedRow{
        return 90
    }else{
        return 40
    }
}

Что я пытаюсь сделать, так это сообщить моей ячейке, что она выбрана, поэтому при выборе она может отображать разные вещи. Кто угодно ?


person Farini    schedule 21.10.2015    source источник
comment
Вы хотите выбрать ячейку программно (а не по инициативе пользователя)?   -  person Nicolas Miari    schedule 21.10.2015
comment
Нет. Я просто хочу, чтобы класс Cell - NSTableCellView знал, когда он был выбран. Я не уверен, что это ViewController, который позволяет ячейке узнать, что она выбрана, или если в классе ячеек есть метод, который запускается, когда ячейка выбрана, и какой метод это будет   -  person Farini    schedule 21.10.2015


Ответы (2)


Выбор не работает с ячейками, он работает со строками. NSTableRowView имеет свойство selected. Обычно он отвечает за отрисовку выбранного внешнего вида строк таблицы с помощью своего метода drawSelectionInRect().

Как именно ваша ячейка меняет свое поведение или внешний вид в зависимости от того, выбрана ли она? Вы уверены, что это не следует делать по очереди? Возможно, вам следует использовать собственный подкласс NSTableRowView.

Если вам нужно, вы можете найти представление строки из представления ячейки. Один из способов состоит в том, чтобы просто предположить, что супервизор ячейки — это вид строки, каким он должен быть, если он не nil. Другой подход состоит в том, чтобы запросить представление таблицы, для какой строки предназначена ячейка, используя rowForView(self), а затем запросить представление таблицы для представления строки, используя rowViewAtRow(_:makeIfNecessary:).

person Ken Thomases    schedule 21.10.2015
comment
идеально. Оно работает! я получаю строку, затем получаю ячейку, а затем я могу сообщить классу ячейки, что он был выбран, добавив var:selected:Bool, как упоминал @NicolasMiari. Спасибо вам обоим! - person Farini; 23.10.2015

NSTableCellView, похоже, не имеет свойства selected. Возможно, вы можете создать подкласс и добавить такое свойство.

Затем реализуйте метод делегата:

optional func tableView(_ tableView: NSTableView,
        shouldSelectRow row: Int) -> Bool

... и в тех случаях, когда вы возвращаете true (т. е. строка должна быть выбрана), установите свойство selected, которое вы только что определили для соответствующей ячейки, на true.

Если вы хотите, чтобы ячейка что-то делала при выборе, определите свое свойство следующим образом:

var selected:Bool {
    didSet {
        if selected {
            // Act accordingly...
        }
    }
}
person Nicolas Miari    schedule 21.10.2015