Nib 文件中的静态单元格未显示
Posted
技术标签:
【中文标题】Nib 文件中的静态单元格未显示【英文标题】:Static cell from Nib file is not shown 【发布时间】:2010-07-16 06:03:29 【问题描述】:我有一个包含分组表视图和一个单元格的 Nib 文件。单元格通过插座连接到 UITableViewController。在cellForRowAtIndexPath
中,我只返回那个单元格,我可以在表格视图中看到一个单元格。但是,当我将表格的行数更改为 2 并想显示相同的单元格时,我只能看到一个,看来第二个单元格应该在那里,因为可见单元格的下角没有圆角,但是,它不存在。
如果我在 nib 文件中创建第二个单元格对象,第二个插座并将其作为第二行返回,它看起来很好。我的单元格具有在 IB 中指定的标识符。
这是否意味着我不能将单元格对象重复使用不止一行?
【问题讨论】:
【参考方案1】:就像视图中的每个可见按钮都需要一个 UIButton 实例一样,每个可见行都需要一个单元格实例。
管理此问题的常见模式是向 tableview 询问不再需要的先前实例化的单元格 (dequeueReusableCellWithIdentifier:
),然后返回该单元格。如果表格视图没有任何可重复使用的单元格,则必须从 nib 文件中实例化一个新单元格。
网上有很多这方面的例子,你也可以在 SO 上找到一些例子,例如 this answer。
我建议您通读 Apples TableView Programming Guide,其中还包含一个 section on loading cells from nibs。
更新: 尝试以不同的方式解释 TableView 和单元格的重用。
假设我们有一个大型画廊 旧画。数以万计的画作。 画廊只有一间陈列室, 不过,它的墙壁只有十个 画作。画廊经理必须 时不时换画 游客感到无聊并想看 一些新画作。
每幅展示的画都需要一个 框架。没有框架就不行 放在墙上。相框很贵 制作,并占用大量空间。这 框架制造商想要有时间也不 建造数千个框架的钱 需要。
他发现他想要被需要 所有画作的框架 暂时没有显示。他只会 当前需要十帧 展示的画作。当画廊 经理拿下一幅画, 框架制造商存储框架,以及何时 画廊经理提出了一个新的 绘画并要求框架制造商 一个框架,框架制造商 返回前一个帧 再画一次。
有一天, 绘画之间需要的空间规则 无缘无故被改变。这 画廊经理可以放两个 更多图片在展示室。他 从店里挑了两幅画 房间,并要求框架制造商 帧。框架制造商没有备用 框架,需要制作两个新的 帧。
现在,假设画廊是一个 TableView,所有的绘画都是数据行。有十幅可见绘画空间的展示室是屏幕,有十个可见行的空间。每个可见行都需要一个单元格,就像每个显示的画都需要一个框架一样。
最后,您不必太在意通过重复使用一个单元来节省资源。这是 TableViews 的责任。这是 TableView 需要多少个单元格以及如何使用它的实现细节。该协议定义了如何向 TableView 请求可重复使用的单元格,并且文档说明您应该这样做。这应该足够了。演示项目表明 TableView 可以管理非常大量的数据。如果您的项目由于从 nib 实例化 10-20 个单元格而在性能方面遇到困难,那么您的 nib 文件或其他东西可能存在一些问题。不过,有一些关于performance of loading from nib versus building cells in code 的讨论。你可能会感兴趣。
【讨论】:
我已经阅读了 TableView 编程指南,并按照从 Nib 文件加载的静态单元格指南中描述的相同方式进行操作,除了我想保存资源并使用单个单元格对象,不同的每一行的内容。您描述的方式与 Apple 指南中的方式不同。所以我知道我应该怎么做才能解决它,但我不知道为什么我不能重复使用同一个单元格。答案不在这里。 您不能对所有单元格重复使用完全相同的单元格对象。每个可见单元格都需要一个实例。但你不应该在意。让 TableView 来处理它。请求一个可重用的单元格,如果它返回 nil,您将需要实例化一个新单元格。如果可以通过为每一行使用相同的单元格来节省资源,则 dequeue 方法将返回第一个在您第一次调用后调用它时被实例化的单元格。【参考方案2】:我有一些非常奇怪的行为,听起来很像你前段时间所描述的。
最终我发现问题在于我刚刚向 xib 添加了一个表格视图单元格,其中包含其他项目,例如父表格视图和控制器。我必须做的是为每个表格视图单元格单独创建一个单独的 xib。我认为问题在于从错误构建的 xib 加载表格视图单元格会混淆问题。
正如 Vegar 所说,有很多关于如何做到这一点的教程。
【讨论】:
以上是关于Nib 文件中的静态单元格未显示的主要内容,如果未能解决你的问题,请参考以下文章