【问题标题】:NSOutlineView moveItem() and reloadItem() doesn't workNSOutlineView moveItem() 和 reloadItem() 不起作用
【发布时间】:2018-06-03 18:01:26
【问题描述】:

我有一个 NSOutlineView。我已经设置了委托和数据源。我做outlineView.reloadData()后它会正确显示所有数据

你可以像这样描绘我的大纲视图:

A 室
- 灰
- 布洛克

B 室
- 朦胧
- 奥克教授

我对数据(不是大纲视图)进行了一些编辑,并将“Misty”移动到房间 A。

A 室
- 灰
- 布洛克
- 迷雾

B 室
- 奥克教授

我做outlineView.reloadData()后,它会正确显示更新的数据。

然后,我改变

outlineView.reloadData()

outlineView.moveItem(at: 0, inParent: room[1], to: 2, inParent: room[0])

但是什么也没发生。我检查了数据源,没有调用数据源。仅当我执行 outlineView.reloadData() 时才会调用它。

我也尝试过outlineView.reloadItem(),但也没有用。

知道为什么outlineView.moveItem() 不起作用吗?

【问题讨论】:

  • 大纲视图为什么要调用数据源?项目的数据不会改变。我试过这个(作为一个 Swift 练习,item 是一个 Swift 类)并且moveItem() 确实有效,带有动画。
  • 就我而言,我必须添加 Hashable 协议。你的类是否符合 Hashable 协议?
  • 我试过了,它可以工作,即使所有对象都返回相同的哈希值。 hashValue 没有被调用。你能在一个小测试项目中重现这个问题吗?

标签: cocoa nstableview appkit nsoutlineview


【解决方案1】:

我不敢相信 Cocoa / Appkit 框架与 UIKit 相比有多不可靠。

moveItem() 不起作用的原因是因为 NSOutlineView 只支持 Objective-C NSObject。 NSOutlineView 的 item 对象不能使用普通的 Swift 类。

【讨论】:

  • 注意:NSOutlineView 确实支持 Swift 对象。您可以为NSOutlineView 的项目对象使用普通的 Swift 类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-15
相关资源
最近更新 更多