UITableView - 具有相同数组的部分中的不同行

Posted

技术标签:

【中文标题】UITableView - 具有相同数组的部分中的不同行【英文标题】:UITableView - different rows in sections with same array 【发布时间】:2015-06-03 22:00:27 【问题描述】:

我有一个数组,我从后端获取它的值,我有一个 UITableView 有 3 个部分和不同的行:

 override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    // #warning Potentially incomplete method implementation.
    // Return the number of sections.
    return 3


override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete method implementation.
    // Return the number of rows in the section.

    if section == 1 

        return 2
     
    else if section == 2 

        return 1

     else 

        return 3
    






override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 


    let myCell: CellTableViewCell = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as! CellTableViewCell

    // Configure the cell...

    if indexPath.section == 1 

        myCell.titleLabel.text = titles[indexPath.row + 3]

    
    else if indexPath.section == 2 

        myCell.textLabel?.text = "Section 2"

    
    else 


        myCell.titleLabel.text = titles[indexPath.row] // ERROR!

    

    return myCell



override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? 

    return "Section"

我需要让来自 2 个不同部分的单元格从同一个数组中获取它们的数据,并且我在中间有一个部分应该从不同的数组中获取它的数据。当我运行时出现此错误:

fatal error: Array index out of range

我的数组包含 5 个值,如下所示:

 titles = ["1", "2", "3", "4", "5"]

PS:我的 TableView 有自定义单元格

编辑:我编辑了这些部分的排列(我第一次知道它们是从下到上索引的),但是我的最后一个部分单元格仍然出现错误,还有一个非常奇怪的行为,当我向下滚动时备份,第 2 部分替换第 1 部分的第 3 个单元格,它被移动到表格的底部!

【问题讨论】:

我在运行您的代码时没有收到任何错误,但它不会像我认为您想要的那样填充单元格。你从上到下得到的是5、5、3、3、3,“第2节”。您不能像现在这样使用循环,因为这只会为该部分中的每个单元格提供您循环通过的最后一个索引(索引 2 或 4)中的值。 【参考方案1】:

您不能像现在这样使用循环,因为这只会为该部分中的每个单元格提供您循环通过的最后一个索引(索引 2 或 4)中的值。通常,对于分段表视图,您将使用数组数组来填充这些部分。如果您想使用单个数组,并且每个部分中的行数与您显示的一样,那么以下应该可以工作,

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

    var titles = ["1", "2", "3", "4", "5"]

    override func viewDidLoad() 
        super.viewDidLoad()
    

     func numberOfSectionsInTableView(tableView: UITableView) -> Int 
        return 3
    

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

        if section == 0 

            return 3
        
        else if section == 1 

            return 1

         else 

            return 2
        
    

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let myCell: UITableViewCell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell

        if indexPath.section == 0 
            myCell.textLabel!.text = titles[indexPath.row]
        
        else if indexPath.section == 1 
            myCell.textLabel!.text = "Section 2"
        
        else 
            myCell.textLabel!.text = titles[indexPath.row + 3]
        

        return myCell
    


这为六个单元格提供了 1、2、3、“Section 2”、4、5(我在测试用例中使用了标准 UITableViewCell)。

【讨论】:

@Abdou023 我不知道您所说的“从下到上索引”是什么意思——它们不是。如果你在 else 子句中使用第一个注释掉的行,你会得到什么确切的错误? 无论我使用什么行,我都会遇到相同的错误:“致命错误:数组索引超出范围” @Abdou023 那么你的数组一定不是你说的那样。如果你登录titles,它会给你什么? 这是我在第一篇文章中的数组,与您在回答中使用的数组相同。如果我注释掉了第 3 节中的所有行,第 1 节可以正常工作 @Abdou023 那么我不知道出了什么问题。我测试了我发布的代码,它可以工作。没有看到你的整个实际代码,我无法进一步评论。【参考方案2】:

您的数组有 5 个值,但您的代码建议您有 6 个。请查看您的 tableView(tableView: UITableView, numberOfRowsInSection section: Int)

【讨论】:

这是故意的,中间部分的额外单元格应该从不同的来源获取数据。 啊,好吧。那么,在尝试检索 values 数组的数据时,您是否考虑了缺少的行索引? 我猜你正试图从索引 5 处的值数组中提取一个值,但你的值数组没有索引 5。

以上是关于UITableView - 具有相同数组的部分中的不同行的主要内容,如果未能解决你的问题,请参考以下文章

在 UITableView 中创建相互独立的部分

不同对象中具有相同名称的两个变量改变彼此的值

UITableView 使用 Realm 和 Swift 具有多个按字母顺序排列的部分,多个标签与相同的数据连接

具有自定义单元格和多节数组数据的 Swift UITableView

对象数组中的 UITableView 部分

使用 Realm 和 Swift 的具有多个部分的 UITableView