在UITableViewController中使用不同类型的单元格和不同的行数

时间:2017-12-01 07:11:33

标签: ios swift uitableview

我正在尝试使用包含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的每个部分中使用不同类型的单元格和不同数量的行吗?

1 个答案:

答案 0 :(得分:1)

你可以尝试一下。如果需要四个部分,那么在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")