Objective c NSTableView:显示展开的行(动态调整大小)

Objective c NSTableView:显示展开的行(动态调整大小),objective-c,macos,cocoa,nstableview,Objective C,Macos,Cocoa,Nstableview,嗯。我仔细阅读了这些建议(在我提问之前,这些建议通常会回答我的问题)。我还没有找到我需要的东西 我知道我做错了什么。我在iOS(UIKit)中一直这样做,但NS(Mac)中的表与UIKit有着天壤之别 我有一个基于视图的NSTableView。每行正好有一列。此列有一个标题视图(高21点)和一个展开视图(行高420点)。标题左侧有一个三角形,用于切换这两种模式 控制器也是表数据源和委托。我让行高回调返回视图的正确值 标题显示良好。我将行高度设置为21,只显示标题。这将剪辑主视图 切换公开三角形

嗯。我仔细阅读了这些建议(在我提问之前,这些建议通常会回答我的问题)。我还没有找到我需要的东西

我知道我做错了什么。我在iOS(UIKit)中一直这样做,但NS(Mac)中的表与UIKit有着天壤之别

我有一个基于视图的NSTableView。每行正好有一列。此列有一个标题视图(高21点)和一个展开视图(行高420点)。标题左侧有一个三角形,用于切换这两种模式

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

标题显示良好。我将行高度设置为21,只显示标题。这将剪辑主视图

切换公开三角形时,一行将扩展其高度以显示整个视图:

够简单了吧

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

我已尝试在视图上设置setNeedsLayout/Draw

关于我可能做错了什么有什么线索吗


我敢打赌,我在做一些愚蠢的事情,我会继续研究这个问题。

使用
notehighofrowswithindexchanged:
?它是一个NSTableView函数,不是委托函数

在委托函数的文档中
tableView:heightOfRow
声明:

尽管表视图可能会缓存返回的值,但您应该确保此方法是有效的。更改行高度时,必须通过调用NoteHeightOfRowsWithIndexChanged:,使现有行高度无效。调用reloadData和noteNumberOfRowsChanged时,NSTableView会自动使其整个行高缓存失效

正如它所提到的,NSTableView的
重载数据
通常也是解决这类问题的惰性方法

您的表控制器不应该需要您尝试过的setNeeds[任何]方法


此外,谈到公开三角形等,在OSX上有一个名为NSOutlineView的NSTableView子类,如果您将数据篡改为文档记录不完整的树格式,它将处理项扩展。如果你的数据不是一棵自然的树,我实际上不会推荐它,但是你应该意识到它,即使它的API很糟糕。哦,单击披露三角形时的展开是动画的。

谢谢!我去看看。我——有点——把它修好了。原始视图分为两个子视图(标题和正文)。我从这些子视图中删除了这些项,并将它们全部放在主视图中。它们现在显示。很奇怪。哦,很有趣。我相信如果屏幕被剪裁,tableview或任何东西只会显示单元格的子帧——我在cellView中使用drawRect时遇到了一些难看的滚动问题——所以我想needsDisplay可能有用,但我不知道。当您将行高标记为“脏”时,TableView应处理此问题。谢谢!我会继续搞乱它,看看它会去哪里。我还想知道它是否与每一行都有自己的viewController有关。行viewController与表不关联。它只是控制行视图本身的行为,这在OSX表中并不常见。我担心你会把指针指向回收的手机视图。tableview拥有并重用CellView。我不确定您在NSViewController中会做什么,而在NSTableRowView或CellView子类中无法做到。虽然我不明白为什么你不应该有一个VC控制下的自定义视图。