UITableView部分是重复数据

时间:2015-12-29 21:10:10

标签: ios swift uitableview

这已经杀了我几个小时了。我有一个UITableViewController,它有多个数据部分。我的数据源只是一个数组。

我遇到的问题是每个部分都是从第一个索引开始重复数组中的数据,而不是"切片"它正如我所期望的那样。

简化示例:     

let sections = ["Section A", "Section B"]
let counts = [3, 5]
let source = ["a","b",c","d","e","f","g","h"]

// Output in simulator:

 # Section A
  - a
  - b
  - c
 # Section B
  - a
  - b
  - c
  - d
  - e
  - and so on...

我希望" B"将是" d"而不是从第一个索引重新启动。

相关代码非常标准:

 override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return sections.count // returns 2
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return counts[section] // returns correct data
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let data = source[indexPath.row]
    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! MyTableViewCell
    // some cell formatting, populate UILabels, etc
    cell.testLabel.text = data["test"].string

    return cell
}

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let  headerCell = tableView.dequeueReusableCellWithIdentifier("Header") as! MyTableViewHeaderCell
    headerCell.backgroundColor = UIColor.grayColor()
    headerCell.testHeaderLabel.text = sections[section]

    return headerCell
}

对SO的初步搜索让我相信它是一个细胞重用问题,但是在我的细胞类中覆盖prepareForReuse后,我不会这么认为。

预期结果

 # Section A
  - a
  - b
  - c
 # Section B
  - d
  - e
  - f
  - g
  - h

就像我说的那样,我希望将TableView数据划分为多个部分将保持对数组指针的引用,并在它停止的地方继续,而不是从每个部分的0开始。

有任何想法或建议吗?

4 个答案:

答案 0 :(得分:0)

indexPath.row始终返回部分内的行号。 在第二部分中,您需要添加之前所有部分中显示的行数。

let data = source[indexPath.row]更改为以下内容:

let data = source[indexPath.row+counts[0]]

如果添加更多部分,计算起来会有点复杂。

其他想法:

如果可能,您可以重新排列阵列。你可以制作一个二维数组。主阵列将包括具有每个部分的数据的阵列。 为了显示它,你'也需要使用indexPath.section

dataArray[indexPath.section][indexPath.row]

答案 1 :(得分:0)

使用FelixSFD的想法,但有一点逻辑修改,所以你可以动态地工作:

改变这个:

let data = source[indexPath.row]

为此:

var countIndex = indexPath.row
for section in 0...indexPath.section {
    countIndex += counts[section]
}
let data = source[countIndex]

请小心这种方法,因为在大型tableView上可能会遇到一些性能问题。

答案 2 :(得分:0)

如果您可以重新排列阵列:

变化

let source = ["a","b",c","d","e","f","g","h"]

let source = [["a","b","c"],["d","e","f","g","h"]]

并更改

 let data = source[indexPath.row]

 let data = source[indexPath.section][indexPath.row]

答案 3 :(得分:0)

我遇到了同样的问题,但是情况比较复杂,我需要更加动态的方式。当然我可以重新排列我的数据,使用二维数组,但我不想稍后处理它。所以我这样做了。

我从firebase中提取数据,所以我不知道,我将拥有多少个/数组。

创建一个数组,在数组中插入多少项。

    var counterTableView = [Int]()

使用0填充数组,没有这样做,我后来遇到错误。 (指数超出范围)

override func numberOfSections(in tableView: UITableView) -> Int {
    for i in 0...Array(Set(self.sections)).count {
        counterTableView.insert(0, at: i)
    }
    counterTableView.removeLast(counterTableView.count-Array(Set(self.sections)).count-1)
    return Array(Set(self.sections)).count
}

下一步,是填充数组中一个部分的项目数量

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

    counterTableView[section+1] = counts[section] + counterTableView[section]}

最后一步,显示单元格中的数据

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
cell.textLabel.text = source[indexPath.row+counterTableView[indexPath.section]]}