【问题标题】:Return NSOutlineView's numberOfChildrenOfItem after a web request网络请求后返回 NSOutlineView 的 numberOfChildrenOfItem
【发布时间】:2019-04-12 18:04:44
【问题描述】:

我的大纲视图中有大约 1500 个项目的列表,每个项目的子项由 API 调用确定,因为 API 只为我提供所有没有子项的父项。

因为它是 1500 个项目,所以我无法在应用程序启动时要求每个父母列出他们的孩子,因此我更愿意返回 numberOfChildrenOfItem,因为它是在用户展开项目后调用的网络请求完成后

我的 API 工作原理的示例代码:

func outlineView(_ outlineView: NSOutlineView, numberOfChildrenOfItem item: Any?) -> Int {

    // code to determine if root or parent

    } else if parent {
        api.updateDatabaseChildren(for: parent) {
            // database has been updated and parent now has children
        }
    }

}

我真的无法解决这个问题,我该怎么做?

【问题讨论】:

    标签: swift cocoa appkit nsoutlineview


    【解决方案1】:

    首先让您的数据源为每个父级的numberOfChildrenOfItem 返回1,为isExpandable 返回true

    对于每个父项中尚未加载其子项的子项,提供一个显示类似“正在加载...”的虚拟项:

    > Parent
    > Parent
    v Parent
         Loading...
    > Parent
    

    当用户展开父项时,从 API 异步加载其子项。收到结果后,使用insertItems() 将子项插入其父项。

    【讨论】:

    • 我的ofItem 返回父级数组索引处的位置,并且由于ofItem 再也不会在父级上调用,因此列表总是过时的。这是否意味着我不应该使用最初给出的项目,而是直接从我的数据库中读取?
    • “直接从我的数据库中读取”是什么意思?您不想/不能在数据源中执行那些异步 API 调用,这需要立即得到答复。如果您可以立即获得所有父母的孩子人数,只需返回实际人数。对于项目,在父项展开时触发 API 调用,显示占位符内容,并在 API 调用返回时重新加载项目,显示正确的数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    相关资源
    最近更新 更多