【问题标题】:Swift Split TableView in two sectionsSwift 将 TableView 拆分为两部分
【发布时间】:2018-09-10 14:53:55
【问题描述】:

我正在为我的学校使用 Swift 做一个项目,我在 TableView 中显示数据。它显示两天的信息,实际的一天和第二天。现在我想每天将表格分成两个部分。如果可以使用带有每个部分日期的部分标题。 如果我已经拥有包含数据的 TableView,我该怎么做。 最好的祝福。 ;)

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {

    thisName = elementName

}

func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {
    if elementName == "element" {
        var myPlan = Plan()
        myPlan.klasse = planKlasse
        myPlan.raum = planRaum
        myPlan.vertreter = planVertreter
        myPlan.art = planArt
        myPlan.fach = planFach
        myPlan.stunde = planStunde
        myPlan.lehrer = planLehrer
        myPlan.datum = planDatum

        print(myPlan)
        tableViewDataSource.append(myPlan)


    }
}

func parser(_ parser: XMLParser, foundCharacters string: String) {


    let data = string.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)

    if data.count != 0 {
        switch thisName {
        case "klasse": planKlasse = data
        case "vertreter": planVertreter = data
        case "raum": if data.hasPrefix("SN") { planRaum = "SNÜRN" } else {planRaum = data}
        case "art": planArt = data
        case "fach": planFach = data
        case "stunde": planStunde = data
        case "lehrer": planLehrer = data; if (data.isEmpty) { planLehrer = "-"}
        case "datum": planDatum = data
        default:
            break
        }

    }
}

func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) {
    print("failure error: ", parseError)
}







func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    return 80
}


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

    if (searchController.isActive && searchController.searchBar.text != "") {
        return filteredElements.count
    } else {
        return tableViewDataSource.count
    }
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let myCell = tableView.dequeueReusableCell(withIdentifier: "reuseCell", for: indexPath)

    var element: Plan

    if (searchController.isActive && searchController.searchBar.text != "") {
        element = filteredElements[indexPath.row]
        myCell.backgroundColor = UIColor.orange
    } else {
        element = tableViewDataSource[indexPath.row]
        myCell.backgroundColor = UIColor.white
    }

    let myKlasseLabel = myCell.viewWithTag(11) as! UILabel
    let myVertreterLabel = myCell.viewWithTag(12) as! UILabel
    let myRaumLabel = myCell.viewWithTag(13) as! UILabel
    let myArtLabel = myCell.viewWithTag(15) as! UILabel
    let myFachLabel = myCell.viewWithTag(14) as! UILabel
    let myStundeLabel = myCell.viewWithTag(16) as! UILabel
    let myLehrerLabel = myCell.viewWithTag(17) as! UILabel
    let myDatumLabel = myCell.viewWithTag(18) as! UILabel


    myKlasseLabel.text = element.klasse
    myVertreterLabel.text = element.vertreter
    myRaumLabel.text = element.raum
    myArtLabel.text = element.art
    myFachLabel.text = element.fach
    myStundeLabel.text = element.stunde + "."
    myLehrerLabel.text = "(" + element.lehrer + ")"
    myDatumLabel.text = element.datum


    if (element.art == "Klausur") {
        myFachLabel.text = "-"
        myLehrerLabel.text = "-"
    }

    if ((defaults.object(forKey: "klasseWahlDef")) as? String != nil) {

        if (tableViewDataSource[indexPath.row].klasse == (defaults.object(forKey: "klasseWahlDef")) as? String) {
        myCell.backgroundColor = UIColor.orange
        } else if (tableViewDataSource[indexPath.row].vertreter == (defaults.object(forKey: "LehrerDef")) as? String) {
           myCell.backgroundColor = UIColor.orange
        }
    }

    if tableViewDataSource[indexPath.row].datum != "hi" {

        let dateFormatterGet = DateFormatter()
        dateFormatterGet.dateFormat = "yyyy-MM-dd"

        let dateFormatterPrint = DateFormatter()
        dateFormatterPrint.locale = Locale(identifier: "de_DE")
        dateFormatterPrint.dateFormat = "E dd.MM.yyyy"


        if let date = dateFormatterGet.date(from: element.datum){
            //print(dateFormatterPrint.string(from: date))
            myDatumLabel.text = dateFormatterPrint.string(from: date)
        }
        else {
            print("There was an error decoding the string")
        }
    }
    return myCell

}

【问题讨论】:

  • 到目前为止你尝试过什么?你能分享一下你的数据源代码吗?
  • 我会分享代码,但它包含很多学校的个人数据,这就是问题所在。我只有一张表,我在其中显示从 XML 解析的数据。它在标签中逐行输入信息。
  • 我不是要学校数据。我要你写的代码。我不相信这会涉及到任何个人信息。
  • 我在顶部添加了代码。这就是解析和表格视图的全部内容

标签: ios swift uitableview tableview uitableviewsectionheader


【解决方案1】:

您必须定义要显示的部分数量:

func numberOfSections(in tableView: UITableView) -> Int {
   return 2
}

然后您必须定义要在每个部分中显示的行数:

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if section == 0 {
        //return number of rows in first section
    }
    else {
        //return number of rows in second section
    }
}

如果你想创建自定义标题,那么你可以使用这个功能:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    // return custom header view
}

但是,如果你只想在标题中显示文本,你可以使用默认的并且只使用 titleForHeaderInSection 函数。

当然,您还必须为单元格返回正确的视图。如果你想查看章节号,你可以直接调用

indexPath.section

【讨论】:

    【解决方案2】:

    尝试检查代码 - https://github.com/RockinGarg/Expandable-TableView-.git

    所需代码

    //setting number of Sections
    func numberOfSections(in tableView: UITableView) -> Int {
        return section.count
    }
    

    如果要自定义 headerView

    //Setting Header Customised View
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    
        //Declare cell
        let headerCell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") as! TableViewCell
    
        //Setting Header Components
        headerCell.titleLabel.text = self.section[section]
        headerCell.ButtonToShowHide.tag = section
    
        //Handling Button Title
        if self.collapaseHandlerArray.contains(self.section[section]){
            //if its opened
            headerCell.ButtonToShowHide.setTitle("Hide", for: .normal)
        }
        else{
            //if closed
            headerCell.ButtonToShowHide.setTitle("Show", for: .normal)
        }
    
        //Adding a target to button
        headerCell.ButtonToShowHide.addTarget(self, action: #selector(ViewController.HandleheaderButton(sender:)), for: .touchUpInside)
            return headerCell.contentView
    
     }
    

    行数

    //Setting number of rows in a section
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if self.collapaseHandlerArray.contains(self.section[section]){
            return items[section].count
        }
        else{
            return 0
        }        
    }
    

    【讨论】:

      【解决方案3】:

      您是否尝试过 UITableViewDataSource 中存在的这个函数:

          func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
          return yourDateString
      }
      

      【讨论】:

      • 我想我试过了,但我需要为两个日期拆分表格,比如今天和明天。
      • 您需要根据日期将 tableViewDataSource 拆分为两部分,然后在 numberOfSections 中,只返回 2,在 titleForHeaderInSection 中,检查部分,如果 (section == 0),您的标题将是“今天”,同样对于 (section == 1),您的标题将是“明天”,并且 numberOfRowsInSection 根据您的 tableViewDataSource 返回计数。
      猜你喜欢
      • 2018-01-06
      • 1970-01-01
      • 2014-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多