【问题标题】:NSTableView / NSOutlineView reload specified rowsNSTableView / NSOutlineView 重新加载指定的行
【发布时间】:2017-10-11 13:38:29
【问题描述】:

我正在NSOutlineView 中实现拖放/重新排序。

我的数据是这样的:

Root
   Child1
   Child2
   Child3

用户将能够通过拖放重新排序子级。

如果我在处理 Drop 的方法中使用reloadData(forRowIndexes:columnIndexes:)NSOutlineView 不会更新,而简单的 reloadData() 工作正常。

我希望我的应用程序尽可能高效,那么如何使用这个reloadData(forRowIndexes:columnIndexes:)

相关代码在这里:

info.enumerateDraggingItems(
        options: .clearNonenumeratedImages,
        for: self.outlineView,
        classes: classes,
        searchOptions: [:])
    { [unowned self] (
        draggingItem: NSDraggingItem,
        idx,
        stop) -> Void in
        let dragged = self.currentlyDraggedObjects![idx] as! RowItem
        let oldParent = dragged.parent!
        let siblings = oldParent.children

        let oldIndex = siblings?.index(where: { (item) -> Bool in
            item.identifier == dragged.identifier
        })

        oldParent.moveChild(from: oldIndex!, to: insertionPos)

        let parentRow = self.outlineView.row(forItem: item)

        let reloadRowRange = oldIndex! < insertionPos ?
            (oldIndex! + parentRow + 1)...(insertionPos + parentRow + 1)
            : (insertionPos + parentRow + 1)...(oldIndex! + parentRow + 1)

        #if DEBUG
            print(#file, #line, reloadRowRange)
        #endif

        // self.outlineView.reloadData() // This works!

        // Doesn't work, why?
        self.outlineView.reloadData(
            forRowIndexes: IndexSet(reloadRowRange),
            columnIndexes: IndexSet(integer: 0)
        )
    }

【问题讨论】:

  • 不要重新加载、移动(或删除和插入)行。
  • 谢谢!移动的动画似乎太多了。所以我最终使用了删除和插入。

标签: swift macos cocoa nstableview nsoutlineview


【解决方案1】:

感谢@Willeke 的评论,现在行已正确更新,作者:

self.outlineView.removeItems(at: IndexSet(integer: oldIndex!),
                                          inParent: oldParent)
self.outlineView.insertItems(at: IndexSet(integer: newIndex),
                                          inParent: oldParent)

【讨论】:

    【解决方案2】:

    添加和删除项目似乎没问题。

    let row = 0
    outlineView.removeItems(at: IndexSet(integer: row), inParent: nil, withAnimation: .effectFade)
    outlineView.insertItems(at: IndexSet(integer: row), inParent: nil, withAnimation: .effectFade)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      相关资源
      最近更新 更多