我有一个数据模型如下:
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时,都必须反复计算数组大小,但是我必须检查数组以上面的预定义顺序显示它们。但是,这是我脑海中唯一的出路。
我想改进代码以提高效率,可能是数据应该存储在模型中的方式(而不是数组或类似的东西......)或者如何将数据正确地填充到表视图中。请指出我应该在哪里改进代码以及如何改进代码。
由于
答案 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!
}
}