如何使用swift在tableview中使用两个不同的数组填充两个部分?

时间:2015-04-11 14:24:16

标签: arrays uitableview swift sections

我有两个数组Data1和Data2,我希望将每个数组(它们包含字符串)中的数据填充到两个不同部分的tableview中。 第一部分的标题应为“Some Data 1”,第二部分的标题应为“KickAss”。

我有两个部分填充第一个数组中的数据(但没有标题)。

到目前为止,这是我的代码:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
    }

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        var rowCount = 0
        if section == 0 {
            rowCount = Data1.count
        }
        if section == 1 {
            rowCount = Data2.count
        }
        return rowCount
    }
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell
        let ip = indexPath
        cell.textLabel?.text = Data1[ip.row] as String
        return cell
    }

在cellForRowAtIndexPath方法中,我是否可以像在numberOfRowsInSection方法中那样识别该部分?另外,我如何为每个部分提供标题? 感谢

5 个答案:

答案 0 :(得分:65)

TableView Cells

您可以使用多维数组。例如:

let data = [["0,0", "0,1", "0,2"], ["1,0", "1,1", "1,2"]]

对于使用的部分数量:

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return data.count
}

然后,要指定每个部分中的行数,请使用:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return data[section].count
}

最后,您需要设置细胞:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cellText = data[indexPath.section][indexPath.row]

    //  Now do whatever you were going to do with the title.
}

TableView标题

你可以再次使用一个数组,但这次只有一个维度:

let headerTitles = ["Some Data 1", "KickAss"]

现在设置各个部分的标题:

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if section < headerTitles.count {
        return headerTitles[section]
    }

    return nil
}

上面的代码检查是否有该部分的标题并将其返回,否则返回nil。如果headerTitles中的标题数量小于data中的数组数量,则不会成为标题。

结果

enter image description here

答案 1 :(得分:22)

您可以创建Struct来保存属于某个部分的数据,以替代我以前的答案。例如:

struct SectionData {
    let title: String
    let data : [String]

    var numberOfItems: Int {
        return data.count
    }

    subscript(index: Int) -> String {
        return data[index]
    }
}

extension SectionData {
    //  Putting a new init method here means we can
    //  keep the original, memberwise initaliser.
    init(title: String, data: String...) {
        self.title = title
        self.data  = data
    }
}

现在,在您的视图控制器中,您可以设置您的部分数据,如下所示:

lazy var mySections: [SectionData] = {
    let section1 = SectionData(title: "Some Data 1", data: "0, 1", "0, 2", "0, 3")
    let section2 = SectionData(title: "KickAss", data: "1, 0", "1, 1", "1, 2")

    return [section1, section2]
}()

章节标题

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return mySections.count
}

override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return mySections[section].title
}

与我之前的回答相比,您现在不必担心将headerTitles的数量与data中的数组数量相匹配。

TableView Cells

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return mySections[section].numberOfItems
}

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cellTitle = mySections[indexPath.section][indexPath.row]

    let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! UITableViewCell
    cell.textLabel?.text = cellTitle

    return cell
}

答案 2 :(得分:13)

您可以通过查看indexPath.section来确定您所在的部分。 要指定标题,请覆盖功能

func tableView(tableView: UITableView!, titleForHeaderInSection section: Int) -> String!

答案 3 :(得分:0)

在Swift 4或Swift 5中,您可以使用以下代码。

此处显示了带有过滤器的自定义标题部分:

enter image description here

  1. 创建一个项目
  2. 添加表格视图
  3. 创建UITableView单元格
  4. 使用视图控制器将标签连接到适合的视图和表
  5. 添加下面的代码

    import UIKit
    
    struct Category {
    let name : String
    var items : [[String:Any]]
    }
    
     class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource,UITextFieldDelegate {
      @IBOutlet weak var txtName: UITextField!
    
     @IBOutlet weak var tableView: UITableView!
    
    var originalArr = [[String:Any]]();
    var recentArr = [[String:Any]]();
    var searchArrRes = [[String:Any]]()
    var searching:Bool = false
    
     //
    var sections = [Category]()
    
    override func viewDidLoad() {
      super.viewDidLoad()
    
    //Assign delegate  don't forget
    txtName.delegate = self
    tableView.delegate = self
    tableView.dataSource = self
    
    
    
    recentArr =   [
        ["name": "Enamul", "number": "+8800000003"],
        ["name": "Enam", "number": "+8800000004"]
    ]
    
    originalArr = [
        ["name": "abdul", "number": "+8800000001"],
        ["name": "abdin", "number": "+8800000002"],
        ["name": "Enamul", "number": "+8800000003"],
        ["name": "enam", "number": "+8800000004"],
        ["name": "Rafi", "number": "+8800000005"],
        ["name": "Ehaque", "number": "+8800000006"]
       ]
    
     //my array
      sections = [
          Category(name:"Recent", items:recentArr),
          Category(name:"ALL", items:originalArr)
          ]
    
          }
    
    
       func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        return true
         }
    
     func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
          guard let tableView = view as? UITableViewHeaderFooterView else { return }
    
       tableView.textLabel?.textColor = UIColor.red
     }
    
     public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{
    //input text
    let searchText  = textField.text! + string
    
    searchArrRes = self.originalArr.filter({(($0["name"] as! String).localizedCaseInsensitiveContains(searchText))})
    
    
    if(searchArrRes.count == 0){
        searching = false
    }else{
        searching = true
    }
    self.tableView.reloadData();
    
    return true
    }
    
    
      func numberOfSections(in tableView: UITableView) -> Int {
    if( searching == true){
        return 1
        }
       return self.sections.count
       }
    
      func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    if( searching == true){
        return ""
       }
      return self.sections[section].name
      }
    
       func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    if( searching == true){
       return searchArrRes.count
    }else{
        let items = self.sections[section].items
        return items.count
      }
     }
    
     func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! Custom_cell
      //  var dict = itemsA[indexPath.section]
    
    if( searching == true){
        var dict = searchArrRes[indexPath.row]
        cell.name.text = dict["name"] as? String
        cell.number.text = dict["number"] as? String
     }else{
        let items = self.sections[indexPath.section].items
        let item = items[indexPath.row]
        cell.name.text = item["name"] as? String
        cell.number.text = item["number"] as? String
    
        }
    
        return cell
         }
    
    
    }
    

您可以从GitHub下载完整的源代码。GitHub像:https://github.com/enamul95/Custom_table_view_section.git

答案 4 :(得分:0)

可以在Tableview中执行节并可以更改页眉节的颜色

   class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

@IBOutlet weak var tabview: UITableView!

var tablecell = NewTableViewCell()

let data = [["SWIFT", "BALENO", "ALTO", "CIAZ"], ["INNOVA", "GLANZA", "FORTUNER"] , ["BMW X5", "BMW M4", "BMW 7 Series", "BMW X7", "BMW i3"]]

let brand: Array<String> = ["MARUTHI", "TOYOTA", "BMW"]



override func viewDidLoad() {
    super.viewDidLoad()

}


 func numberOfSections(in tableView: UITableView) -> Int {
    return brand.count
}

  func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
       return data[section].count    }


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

    return self.brand[section]

}


func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {

    // can change the header color of background and title with this code :)

    (view as! UITableViewHeaderFooterView).contentView.backgroundColor = UIColor.red.withAlphaComponent(0.4)
    (view as! UITableViewHeaderFooterView).textLabel?.textColor = UIColor.yellow

    }



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

    let cell1: NewTableViewCell = tableView.dequeueReusableCell(withIdentifier: "cell1") as! NewTableViewCell

    let text = data[indexPath.section][indexPath.row]

    cell1.textLabel!.text = text

    return cell1
}




override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}