首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSTableView / NSOutlineView重装指定的行

NSTableView / NSOutlineView重装指定的行
EN

Stack Overflow用户
提问于 2017-10-11 21:38:30
回答 2查看 722关注 0票数 2

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

我的数据是这样的:

代码语言:javascript
复制
Root
   Child1
   Child2
   Child3

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

如果我在处理Drop的方法中使用reloadData(forRowIndexes:columnIndexes:)NSOutlineView不会更新,而一个简单的reloadData()可以很好地工作。

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

相关代码如下:

代码语言:javascript
复制
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)
        )
    }
EN

回答 2

Stack Overflow用户

发布于 2017-10-12 13:29:01

多亏了@Willeke的评论,现在行被正确地更新了,通过:

代码语言:javascript
复制
self.outlineView.removeItems(at: IndexSet(integer: oldIndex!),
                                          inParent: oldParent)
self.outlineView.insertItems(at: IndexSet(integer: newIndex),
                                          inParent: oldParent)
票数 4
EN

Stack Overflow用户

发布于 2018-11-07 23:18:11

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

代码语言:javascript
复制
let row = 0
outlineView.removeItems(at: IndexSet(integer: row), inParent: nil, withAnimation: .effectFade)
outlineView.insertItems(at: IndexSet(integer: row), inParent: nil, withAnimation: .effectFade)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46689701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档