在特定单元格中添加部分

时间:2017-05-31 04:40:16

标签: ios swift

我使用PLIST实现了一个tableView来设置属性。

我想在特定行添加三个部分。 (第12行,第24行,第35行)

我尝试使用以下代码,但代码太多而且效果不佳。

下面添加了图片和代码。

enter image description here

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
}

2 个答案:

答案 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: