我正在尝试使用具有4个部分的UITableViewController(静态表视图),每个部分具有不同类型的单元格。

一个部分中的单元格数量取决于从Web服务接收的数据。在情节提要中,我在每个部分中创建了一种类型的单元格。

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // Number of rows in attachment sect
    if section == 2 {
        guard let currentDataModel = dataModel else { return 0 }
        return currentDataModel.attachments.count
    }
    else if section == 3 {
        guard let currentDataModel = dataModel else { return 0 }
        return currentDataModel.contacts.count
    }
    return super.tableView(tableView, numberOfRowsInSection: section)
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let currentSection = indexPath.section
    if currentSection == 2 {

        let currentRow = indexPath.row
        let cell = tableView.dequeueReusableCell(withIdentifier: "attachmentCell", for: indexPath) as! AttachmentViewCell
        cell.setDataForCell(dataModel: dataModel?.attachments[currentRow], indexPath: indexPath)
        return cell
    }
    //Show cells for Contact Section
    else if currentSection == 3 {
        let currentRow = indexPath.row
        let cell = tableView.dequeueReusableCell(withIdentifier: "contactCell", for: indexPath) as! ContactViewCell
        cell.setDataForCell(dataModel: dataModel?.contacts[currentRow], indexPath: indexPath)
        return cell
    }
    return super.tableView(tableView, cellForRowAt: indexPath)
}

调用dequeueReusableCellWithIdentifier:forIndexPath时出现此错误:

由于未捕获的异常“NSRangeException”而终止应用程序,原因:“***-[__ NSArrayI objectAtIndex:]:索引2超出范围[0 .. 1]”

我可以在UITableViewController的每个部分中使用不同类型的单元格和不同数量的行吗?

最佳答案

您可以尝试一下吗。如果需要四个部分,则在numberofsections中返回4。您可以按如下所示将标题添加到每个部分,然后再将其添加到viewForHeaderInSection的标签中。您必须正确提供每个部分的行数。

override func numberOfSectionsInTableView(tableView: UITableView) -> Int
    {
        return 4
    }


    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        if(section == 0)
        {
            return "Section 0"
        }
        else if(section == 1)
        {
            return "Section 1"
        }
        else if(section == 2)
        {
            return "section 2"
        }
        else if(section == 3)
        {
            return "section 3"
        }
        return ""
    }

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows

        switch(section)
        {
        case 0: //for first section
            //return your count

        case 1://Cells for

            //return your count

        case 2:

            //return your count

        case 3:
          //return your count

        default:
            return 4
        }

    return 0
}

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        if indexPath.section == 0 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as! Cell1

            return cell

        }
    else if indexPath.section == 1 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as! Cell1

            return cell

        }

 else if indexPath.section == 2 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as! Cell1

            return cell

        }

 else if indexPath.section == 3 {
            let cell = tableView.dequeueReusableCell(withIdentifier: "cell1", for: indexPath) as! Cell1

            return cell

        }
else {

            let cell = tableView.dequeueReusableCell(withIdentifier: "cell2", for: indexPath) as? Cell2
            //Set up labels etc.
            return cell!
        }
    }

 override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let headerView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.width, height: 50))
    headerView.layer.borderWidth = 2
    let myLabel = UILabel()
    myLabel.frame = CGRectMake(0, 0, tableView.frame.width - 70, 50)
    myLabel.font = UIFont.boldSystemFontOfSize(18)
    myLabel.textColor = UIColor.whiteColor()
    myLabel.textAlignment = .Left
    myLabel.text = "  " + self.tableView(tableView, titleForHeaderInSection: section)!
    headerView.addSubview(myLabel)
    return headerView
}

如果您使用的是.xib文件,则还应该将该文件在viewDidLoad()中注册为
self.tableView.registerNib(UINib(nibName: "cell1", bundle: nil), forCellReuseIdentifier: "cell1")

self.tableView.registerNib(UINib(nibName: "cell2", bundle: nil), forCellReuseIdentifier: "cell2")

10-08 01:02