将多个自定义 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 中不起作用

如何判断自定义 UITableViewCell Xib 在哪个 UIViewController 上?

ios tableViewCell.xib文件生成多个单元格