Swift: NSTableView перетащите, чтобы изменить порядок элементов, как отобразить ячейку во время перетаскивания. - PullRequest
0 голосов
/ 01 апреля 2020

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

Я использую NSTableRowView. Мне нужно, чтобы он работал с NSTableRowView. Если у вас есть идея, как это сделать ..

Фактический результат:

enter image description here

Мой код:

    public func tableView(_ tableView: NSTableView, pasteboardWriterForRow row: Int) -> NSPasteboardWriting? {
        let account = viewModel.formattedServices[row]

        let pasteboardItem = NSPasteboardItem()
        pasteboardItem.setString(account.id, forType: NSPasteboard.PasteboardType(rawValue: "mymoney.account"))
        return pasteboardItem
    }

    public func tableView(_ tableView: NSTableView, validateDrop info: NSDraggingInfo, proposedRow row: Int, proposedDropOperation dropOperation: NSTableView.DropOperation) -> NSDragOperation {

        if dropOperation == .above {
            return .move
        } else {
            return []
        }
    }

    public func tableView(_ tableView: NSTableView, acceptDrop info: NSDraggingInfo, row: Int, dropOperation: NSTableView.DropOperation) -> Bool {
        guard let item = info.draggingPasteboard.pasteboardItems?.first,
              let theString = item.string(forType: NSPasteboard.PasteboardType(rawValue: "mymoney.account")),
              let account = viewModel.formattedServices.first(where: { $0.id == theString }),
              let originalRow = viewModel.formattedServices.firstIndex(where: { $0.id == account.id })
                else { return false }

        var newRow = row
        // When you drag an item downwards, the "new row" index is actually --1. Remember dragging operation is `.above`.
        if originalRow < newRow {
            newRow = row - 1
        }

        // Animate the rows
        tableView.beginUpdates()
        tableView.moveRow(at: originalRow, to: newRow)
        tableView.endUpdates()

        return true
    }

Я не могу найти способ вернуть представление ячейки во время перетаскивания.

Для просмотра ячейки возврата я использую func tableView(_ tableView: NSTableView, rowViewForRow row: Int) -> NSTableRowView?

И мой NSTableRowView:

class ServicesTableViewCell: NSTableRowView, CustomCelleable {

    @IBOutlet weak var titleLbl: NSTextField!
    @IBOutlet weak var notificationCount: NSButton!
    @IBOutlet weak var iconImageView: NSImageView!


    override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
        isEmphasized = false
    }

    func setup(with item: Celleable) { }

1 Ответ

1 голос
/ 02 апреля 2020

Шаг 1 NSTableRowView не может заменить NSTableCellView, используйте NSTableCellView для ячеек таблицы.

Начиная с тестового приложения. В IB выберите столбец в табличном представлении и добавьте текстовое представление ячейки таблицы из библиотеки.

enter image description here

В ViewController.swift замените tableView(_:rowViewForRow:) tableView(_:viewFor:row:).

func tableView(_ tableView: NSTableView, viewFor tableColumn: NSTableColumn?, row: Int) -> NSView? {
    guard let cell = tableView.makeView(withIdentifier: tableColumn!.identifier, owner: self) as? NSTableCellView else {
        fatalError()
    }

    cell.textField?.stringValue = array[row].name

    return cell
}

В setTableView() удалить регистрацию пера.

func setTableView() {
    tableView.delegate = self
    tableView.dataSource = self
    tableView.registerForDraggedTypes([NSPasteboard.PasteboardType(rawValue: "mymoney.account")])
}

ServicesTableViewCell больше не используется.

Шаг 2 Используйте подкласс NSTableRowView для отключения isEmphasized:

Добавьте подкласс NSTableRowView, назовем его ServicesTableRowView.

Переопределить isEmphasized, чтобы сделать его всегда false.

class ServicesTableRowView: NSTableRowView {

    override var isEmphasized: Bool {
        get {
            return false
        }
        set {
            // do nothing
        }
    }

}

В IB выберите табличное представление и добавьте пользовательское представление из библиотеки. Установите класс вида на ServicesTableRowView и идентификатор NSTableViewRowViewKey.

Xcode IB

Модифицированный тестовый проект: we.tl/t- yjpZrz6q7g

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...