我使用PLIST实现了一个tableView来设置属性。
我想在特定行添加三个部分。 (第12行,第24行,第35行)
我尝试使用以下代码,但代码太多而且效果不佳。
下面添加了图片和代码。
import UIKit
class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var tblStoryList: UITableView!
var array = PLIST.shared.mainArray
var array = PLIST.shared.mainArray
let sections: [String] = ["First stage","Second Stage","Third Stage"]
let s1Data : [String] = ["Row1","Row2","Row3"]
let s2Data : [String] = ["Row4","Row5","Row6"]
let s3Data : [String] = ["Row7","Row8","Row9"]
var sectionData: [Int: [String]] = [:]
override func viewDidLoad() {
super.viewDidLoad()
sectionData = [0: s1Data, 1: s2Data, 2: s3Data]
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return (sectionData[section]?.count)!
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sections[section]
}
func numberOfSections(in tableView: UITableView) -> Int {
return 3
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) ->
UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "StoryTableviewCell", for: indexPath) as! StoryTableviewCell
//making plist file
let dict = self.array[indexPath.row]
let title = dict["title"] as! String
let imageName = dict["image"] as! String
let temp = dict["phrases"] as! [String:Any]
let arr = temp["array"] as! [[String:Any]]
let detail = "progress \(arr.count)/\(arr.count)"
//property to plist file
cell.imgIcon.image = UIImage.init(named: imageName)
cell.lblTitle.text = title
cell.lblSubtitle.text = detail
cell.selectionStyle = UITableViewCellSelectionStyle.none
return cell
}
答案 0 :(得分:1)
你在tableView中得到的indexPath.row的cellForRowAt是相对于该部分的。您不能将它直接用作主数组的索引(包含所有行)。
您需要执行一个简单的计算,将indexPath.row转换为该数组的索引(通过使用前面部分的总项数来抵消该行):
let index = [0,12,36][indexPath.section] + indexPath.row
let dict = array[index]
同样的事情适用于您给numberOfRowsInSection的响应:
return [12,24,35][section]
我发现数据结构(PLIST)如此严格以至于它总是包含那些条目数并且永远不会改变,这有点奇怪。如果只是为了避免在整个地方传播硬编码数字(例如12,24,35,36),我建议采用更通用的方法。
例如:
// declare section attributes in your class
let sectionTitles = ["First stage","Second Stage","Third Stage"]
let sectionSizes = [12,24,35] // central definition, easier to maintain (or adjust to the data)
let sectionOffsets = sectionSizes.reduce([0]){$0 + [$0.last!+$1] }
// and use them to respond to the table view delegate ...
let index = sectionOffsets[indexPath.section] + indexPath.row
let dict = array[index]
// ...
return sectionSizes[section] // numberOfRowsInSection
使用这种方法,您不需要创建sectionData(除非您将其用于其他目的)。
顺便说一句,在您的示例代码中,sectionData内容是使用与预期的部分大小不一致的数据进行硬编码的,因此即使使用正确的索引计算它也不会起作用。
答案 1 :(得分:0)
你可以尝试在tableView中使用switch case:cellForRowAtIndexPath: