使用具有 2 个不同原型单元格的数据加载表格视图
Posted
技术标签:
【中文标题】使用具有 2 个不同原型单元格的数据加载表格视图【英文标题】:Loading table view with data with 2 different prototype cells 【发布时间】:2019-05-30 02:05:56 【问题描述】:我试图在不同的时间用不同的原型单元格填充 tableView。问题是let cell = tableView.dequeueReusableCell(withIdentifier: "MeArticlesCell") as? MeArticlesCell else return UITableViewCell()
之后的任何代码都没有被调用,我不知道为什么。我返回正确的行数。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if(postsSelected)
guard let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell") as? feedMessagesCell else return UITableViewCell()
//the code in this part loads posts fine
else
guard let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell") as? feedMessagesCell else return UITableViewCell()
//this part never gets called
【问题讨论】:
当您写//this part never gets called
时,您指的是guard let
声明?或者之后会发生什么?
更正:它确实被调用,但在调用该行之后没有任何内容
在 if 语句之前尝试print(postsSelected)
。它很可能总是正确的,因此永远不会进入else
声明
这不是我已经检查过的问题
那么我们需要更多信息。只需在 else
语句中打印一些内容,就可以弄清楚“这部分永远不会被调用”。
【参考方案1】:
基本上你的guard
语句失败并进入else
部分。
guard let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell") as? feedMessagesCell else // this fails
// enters here
return UITableViewCell()
// exist the function - nothing will be run after
我的猜测是它未能将它投射为feedMessagesCell
,因此tableView.dequeueReusableCell(withIdentifier: "messageCell") as? feedMessagesCell
使cell
为零(然后输入else
部分)
【讨论】:
那部分工作它的第二个守卫让失败了 尽管在您的示例中它们都是相同的。问题仍然存在:在保护语句失败后什么都不会运行,这就是它的设计目的。检查你的 init/cast 失败的地方,你很高兴 我刚刚注意到,有人可能在编辑中更改了它。问题是我在代码中使用 MeArticlesCell 作为标识符,但在情节提要中使用 MeArticleCell,它有效,但现在我正在处理这些单元格大小不同的问题【参考方案2】:您正在使用dequeueReusableCell(withIdentifier:)
方法初始化单元格,如果它没有找到任何可重用单元格,则返回nil
。 More here
具有关联标识符的 UITableViewCell 对象,如果没有,则为 nil 此类对象存在于可重用单元队列中。
您应该使用dequeueReusableCell(withIdentifier:for:)
,如果它没有找到任何可重复使用的单元格,它会初始化一个新单元格。 More here
具有关联重用标识符的 UITableViewCell 对象。这 方法总是返回一个有效的单元格。
【讨论】:
以上是关于使用具有 2 个不同原型单元格的数据加载表格视图的主要内容,如果未能解决你的问题,请参考以下文章
我想使用带有多个单元格的表格视图,一个单元格有多个列,2 个单元格只有一列