将多个数据数组显示到单个tableview部分的有效方法

时间:2017-07-27 05:15:36

标签: ios swift

我有一个数据模型如下:

class Model {
var field1 = Data()
var field2 = Data()
var field3 = [Data]()
var field4 = [Data]()
}
var model = Model() // Provide data here

模型将从API获取并解析,我使用另一个类Data作为子模型来形成模型。我需要按顺序将Model对象显示到单个表视图部分:

  

field1 - > field2 - > [field3] - > [field4中]

我打算做的事情如下:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return model.count

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "StatusCell") as! StatusCell
switch indexPath.row {
  case 0:
    // Do something with field1
  case 1:
    // Do something with field2
  case 2...(2 + field3.count):
    // Do something with field3
  case (2 + field3.count)...(2 + field3.count + field4.count)
    // Do something with field4
return cell
}

正如我的观点,它效率很低,因为每次调用cellForRowAt时,都必须反复计算数组大小,但是我必须检查数组以上面的预定义顺序显示它们。但是,这是我脑海中唯一的出路。

我想改进代码以提高效率,可能是数据应该存储在模型中的方式(而不是数组或类似的东西......)或者如何将数据正确地填充到表视图中。请指出我应该在哪里改进代码以及如何改进代码。

由于

3 个答案:

答案 0 :(得分:0)

最简单的方法是你可以使用tableView Section,但是当你描述你想在单个部分中填充所有数据字段时,这样就不要实现titlefroHeader委托或者在这个委托中传递空字符串你可以看到tableview填充像单个部分。

 override func numberOfSections(in tableView: UITableView) -> Int {
    return numberOfFields
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0
    {
        return [field1 count]
    }
    else
    {
        return [otherfield count]
    }
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView .dequeueReusableCell(withIdentifier: "cell")!
  if indexPath.section == 0
    {
        cell.textLabel?.text = field1 .object(at: indexPath.row)
    }
    else
    {
        cell.textLabel?.text = otherfield .object(at: indexPath.row)
    }// assuming fileds array containing string
    return cell
}//pass empty string in this delegate or dont implement it, or if you want to display the first header text the pass in other empty string 
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
     if section == 0
    return "section"
    else 
      return ""
}

}

如果您需要讨论其他任何内容,请随意

答案 1 :(得分:0)

这里最好的选择是为每个字段属性使用表格视图部分,但如果您只想使用1个部分,则可以简单地组合数据:

class Model {
     var field1 = Data()
     var field2 = Data()
     var field3 = [Data]()
     var field4 = [Data]()

     func getAllFields() -> [Data] {
          return [field1, field2] + field3 + field4
     }
}

let allModelFields = model.getAllFields()    

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
     return allModelFields.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCell(withIdentifier: "StatusCell") as! StatusCell
     let fieldItem = allModelFields[indexPath.row]
     // TODO: Configure your cell with current field item
     return cell
}

更新: 不是最好的解决方案,但应该适用于您的特定类型的请求,但我建议您更改模型并使用1个数组(如果您的逻辑允许或仅使用表格视图部分。)

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "StatusCell") as! StatusCell
let row = indexPath.row
switch row {
  case 0, 1:
    // Do something with field1 or field2
  default:
    let field3count = model.field3.count
    if row - 1 <= field3count {
       let field3item = model.field3[row - 2]
       //Do something with field3item
    } else {
       let field4item = model.field4[row - 2 - field3count]
       //Do something with field4item
    }
return cell
}

答案 2 :(得分:0)

我知道为时已晚,但像我这样会找到问题的新用户会得到这个答案。我有三个数组,需要在每个数组上显示三个标题。这是我的代码和结果图片,希望对其他人有所帮助。

extension TripViewController: UITableViewDataSource, UITableViewDelegate {

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    let count = array1.count + array2.count + array3.count + 3
    return count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell")
   
    if indexPath.row == 0 {
        cell?.textLabel?.textColor = .red
        cell?.textLabel?.text = "Heading 1"
    } else if indexPath.row + 1 <= array1.count + 1 {
        cell?.textLabel?.text = array1[indexPath.row - 1]
        
    } else if indexPath.row == array1.count + 1 {
        cell?.textLabel?.textColor = .red
        cell?.textLabel?.text = "Heading 2"
        
    } else if indexPath.row <= array2.count + array1.count + 1 {
        cell?.textLabel?.text = array2[indexPath.row - array1.count - 2]
        
    } else if indexPath.row == array1.count + array2.count + 2 {
        cell?.textLabel?.textColor = .red
        cell?.textLabel?.text = "Heading 3"
        
    } else if indexPath.row <= array1.count + array2.count + array3.count + 3 {
        cell?.textLabel?.text = array3[indexPath.row - array1.count - array2.count - 3]
    }
    return cell!
}
}

Here is result