将多个自定义 TableViewCell Xib 索引到 TableView
Posted
技术标签:
【中文标题】将多个自定义 TableViewCell Xib 索引到 TableView【英文标题】:Indexing Multiple Custom TableViewCell Xibs into TableView 【发布时间】:2019-11-07 17:57:28 【问题描述】:我正在创建一个 TableView,它从顶部的一个图像开始,大约 5 个已解析的 json 单元格,另一个图像,大约 3 个已解析的 json 单元格,以及另一个图像。
我正在使用 3 个自定义笔尖。每一个都是独一无二的。
我在“let item = page?.collapsibles[indexForSecondSetTableViewCells]”行收到“索引超出范围”错误
这是我的代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let currentIndex = indexPath.row - 1
let numberofCarousels = self.page?.carousels.count
let indexAfterCarousels = numberofCarousels ?? 00 + 1
let indexForSecondSetTableViewCells = indexAfterCarousels + 1
if indexPath.row == 0
let cell = tableView.dequeueReusableCell(withIdentifier: "pipesOne", for: indexPath) as! Pipes1TableViewCell
cell.pipesOne.image = UIImage(named: "WhatsNew1")
return cell
if indexPath.row == indexAfterCarousels
let cell = tableView.dequeueReusableCell(withIdentifier: "pipesOne", for: indexPath) as! Pipes1TableViewCell
cell.pipesOne.image = UIImage(named: "WhatsNew2")
return cell
if indexPath.row == indexForSecondSetTableViewCells
let cell = tableView.dequeueReusableCell(withIdentifier: "collapsibleCell", for: indexPath) as! CollapsiblesTableViewCell
let item = page?.collabsible[indexForSecondSetTableViewCells]
cell.collabsibleTitle.text = item?.title
cell.collabsibleDescription.text = item?.content
return cell
let cell = tableView.dequeueReusableCell(withIdentifier: "newsTableViewCell", for: indexPath) as! NewsTableViewCell
let item = page?.carousels[currentIndex]
cell.newsTitle.text = item?.title
cell.newsText.text = item?.caption
cell.newsImage.kf.setImage(with: page?.carousels[currentIndex].imageURL)
return cell
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return (page?.carousels.count ?? 0) + 1 + (page?.collapsibles.count ?? 0)
更新:我将代码简化为两次使用相同的 json 对象,以便每个项目都映射到它应该去的确切单元格,我仍然在第 7 行收到“致命错误:索引超出范围”错误let item = page?.collapsible[indexPath.row]
新代码:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
if indexPath.row == 0
let cell = tableView.dequeueReusableCell(withIdentifier: "pipesOne", for: indexPath) as! Pipes1TableViewCell
cell.pipesOne.image = UIImage(named: "WhatsNew1")
return cell
if indexPath.row == 1
let cell = tableView.dequeueReusableCell(withIdentifier: "newsTableViewCell", for: indexPath) as! NewsTableViewCell
let item = page?.carousels[indexPath.row]
cell.newsTitle.text = item?.title
cell.newsText.text = item?.caption
cell.newsImage.kf.setImage(with: page?.carousels[indexPath.row].imageURL)
return cell
if indexPath.row == 6
let cell = tableView.dequeueReusableCell(withIdentifier: "pipesOne", for: indexPath) as! Pipes1TableViewCell
cell.pipesOne.image = UIImage(named: "WhatsNew2")
return cell
if indexPath.row == 7
let cell = tableView.dequeueReusableCell(withIdentifier: "collapsibleCell", for: indexPath) as! CollapsiblesTableViewCell
let item = page?.collapsibles[indexPath.row]
cell.collabsibleTitle.text = item?.title
cell.collabsibleDescription.text = item?.content
return cell
return UITableViewCell()
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return 11
【问题讨论】:
【参考方案1】:尝试print("\(indexPath)")
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
print("\(indexPath)")
然后你就会知道它在崩溃之前成功显示了多少行。
然后在cellForRowAt
中放置条件断点,以便在 indexPath 是它崩溃的那个时停止。
现在做po (page?.carousels.count ?? 0) + 1 + (page?.collapsibles.count ?? 0)
查看您的 tableview 有多少行。绝对indexForSecondSetTableViewCells
超过行数
【讨论】:
它在第 6 行之后崩溃,所以一旦我试图将第二组 JSON 数据放入第 6 个单元格之后的行中。似乎它可能是“if indexPath.row == indexForSecondSetTableViewCells”这一行,但我不确定我还能放什么,但它不再真正指代一行,它是说将数据属性到单个单元格, 我认为。当我用断点打印print((page?.carousels.count ?? 0) + 1 + (page?.collapsibles.count ?? 0))
时,我得到: 1 9 9 9 9 9 9 9
当它在 indexPath.row == 6 处中断时,不要打印((page?.carousels.count ?? 0) + 1 + (page?.collapsibles.count ?? 0))。在控制台中使用 po (page?.carousels.count ?? 0) + 1 + (page?.collapsibles.count ?? 0)。它应该给你一个小于 indexForSecondSetTableViewCells 的数字
它给了我 9,这是从 0 开始计数的单元格总数的正确值。
这意味着您的数据源有 10 个项目。 page?.collapsibles.count 也是 10 吗?如果不是这种情况,则第 10 行第 10 项的数据不在 page?.collapsibles[] 的索引 9 中。
我根据这个反馈做了一些调整,但我仍然没有看到预期的结果。我将行数更改为返回 10。我还将 if indexPath.row == indexForSecondSetTableViewCells let item = page?.collabsible[indexForSecondSetTableViewCells]
更改为 if indexPath.row == 7 let item = page?.collapsibles[indexPath.row]
以上是关于将多个自定义 TableViewCell Xib 索引到 TableView的主要内容,如果未能解决你的问题,请参考以下文章
自定义tableviewcell中的文本字段在滚动时离开单元格
无法将 XIB 加载到可重用的 TableViewCell 中
swift学习笔记三.使用xib自定义UITableViewCell
TapGestures 在自定义 TableViewCell 中不起作用