Подтвердить что ты не робот

Возможно ли создать NSTableView на основе представления только в коде?

Я успешно создал NSTableView на основе ячеек только в коде. Я хотел бы сделать ячейки немного интереснее, и я прочитал, что мне нужно создать NSTableView на основе представления.

У меня были такие уроки, как this.

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

Вот как я определяю TableView - мне нужно прекратить регистрацию Nib, и я не уверен, как:

     let nib = NSNib(nibNamed: "TransactionCellView", bundle: NSBundle.mainBundle())
        tableOfTransactions.registerNib(nib!, forIdentifier: "TransactionCellView")

        tableOfTransactions.headerView = nil

        tableOfTransactions.setDelegate(self)
        tableOfTransactions.setDataSource(self)
        tableOfTransactions.reloadData()

Вот мой код-заглушка для каждой ячейки:

func tableView(tableView: NSTableView, viewForTableColumn tableColumn: NSTableColumn?, row: Int) -> NSView?{
        var testCell = NSView()
        testCell.frame = NSRect(x: 0, y: 0, width: 300, height: 200)
        return testCell
}

Любые указатели или предложения о том, как достичь этого, будут высоко оценены!

4b9b3361

Ответ 1

Ваша реализация -tableView(_:viewForTableColumn:row:) должна выглядеть примерно так:

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

        var retval: NSView?
        if let spareView = tableView.makeViewWithIdentifier("CodeCreatedTableCellView",
            owner: self) as? NSTableCellView {

            // We can use an old cell - no need to do anything.
            retval = spareView

        } else {

            // Create a text field for the cell
            let textField = NSTextField()
            textField.backgroundColor = NSColor.clearColor()
            textField.translatesAutoresizingMaskIntoConstraints = false
            textField.bordered = false
            textField.controlSize = NSControlSize.SmallControlSize

            // Create a cell
            let newCell = NSTableCellView()
            newCell.identifier = "CodeCreatedTableCellView"
            newCell.addSubview(textField)
            newCell.textField = textField

            // Constrain the text field within the cell
            newCell.addConstraints(
                NSLayoutConstraint.constraintsWithVisualFormat("H:|[textField]|",
                    options: [],
                    metrics: nil,
                    views: ["textField" : textField]))

            newCell.addConstraints(
                NSLayoutConstraint.constraintsWithVisualFormat("V:|[textField]|",
                    options: [],
                    metrics: nil,
                    views: ["textField" : textField]))

            textField.bind(NSValueBinding,
                toObject: newCell,
                withKeyPath: "objectValue",
                options: nil)

            retval = newCell
        }

        return retval
}

В случае, если ваша таблица содержит сотни строк, Cocoa будет пытаться повторно использовать созданные ранее представления, но больше не находится на экране. Первая часть этого фрагмента использует метод NSTableView для поиска такого представления. Если ни один не найден, вам нужно создать его с нуля.

Если у вас нет причин для этого, вы должны использовать экземпляр (или подкласс) NSTableCellView в качестве вашего представления. Он не добавляет особого значения в NSView, но одна из его ключевых особенностей заключается в том, что он сохраняет ссылку на модель, представленную представлением (устанавливается -tableView(_:objectValueForTableColumnRow:row:)). В этом примере я использовал эту функцию для установки строкового значения текстового поля с помощью привязок.

Следует отметить, что вы должны дать вашему представлению идентификатор, который соответствует идентификатору, который вы указали для NSTableColumn, в котором будет отображаться представление. Это позволяет вашему представлению таблицы использовать функцию повторного просмотра, описанную выше.