2014-05-01 35 views
1

好的。我浏览了一些建议(在问我之前经常回答我的问题)。我没有找到我需要的东西。NSTableView:显示一个扩展行(动态调整大小)

我知道我做错了什么。我一直在iOS(UIKit)中执行此操作,但NS(Mac)中的表格与UIKit完全不同。

我有一个基于视图的NSTableView。每行有1列。此列有一个标题(高21点)和扩大视图(该行高420点)。标题左侧有一个显示三角形,用于切换这两种模式。

控制器也是表数据源和委托。我有行高调用,为视图返回正确的值。

标题显示正常。我将行高设置为21,只显示标题。这剪辑了主视图。

A row of closed headers

当一个三角形被触发,行扩大其高度以露出整个视图:

An open row

足够简单,是吗?

问题是B不显示。我只是得到一个空白(但是,A被正确显示)。项目在那里,只是没有被显示。表格行是正确的高度(这可以通过使用交替行颜色来验证)。

我试过在视图上设置setNeedsLayout/Draw。

我可能做错了什么线索?

我敢打赌,我正在做一件头脑发热的事情,我会继续研究这件事。

回答

1

使用noteHeighOfRowsWithIndexesChanged:?这是一个NSTableView函数,而不是委托函数。

在为委托功能tableView:heightOfRow它声明的文档:

虽然表视图可以缓存返回的值,你应该确保这种方法是有效的。当您更改行的高度时,您必须通过调用noteHeightOfRowsWithIndexesChanged:来使现有行高度无效。当reloadData和noteNumberOfRowsChanged被调用时,NSTableView会自动使其整个行高度缓存失效。

就像它提到的那样,NSTableView的reloadData通常是解决您的问题的懒惰方式。

你的表控制器不应该需要你试过的setsNeeds [whatever]方法。

此外,在披露三角形等方面,OSX上有一个名为NSOutlineView的NSTableView子类,用于处理项目扩展,如果您将数据转换为记录不良的树格式。如果你的数据不是一棵天然的树,我实际上不会推荐它,但你应该意识到它,即使它的API很糟糕。哦,点击显示三角形时的展开动画。

+0

谢谢!我会检查一下。我 - 修复它。原始视图被分成2个子视图(标题和正文)。我从这些子视图中删除了这些项目,并将它们全部放在主视图中。他们现在显示。很奇怪。 –

+0

哦,有趣。我相信桌面视图或任何显示单元格的子帧,如果显示被裁剪 - 在cellView中使用drawRect时,我有一些丑陋的滚动问题 - 所以我猜needsDisplay可能是有用的,但我不知道。当您将行高标记为脏时,TableView应处理该事件。 – stevesliva

+0

谢谢!我会一直搞乱它,看看它发生了什么。 –