如何使用UITableView在列表中创建列表

时间:2018-05-10 09:24:54

标签: ios uitableview

我有一个要求。我必须得到学生名单,然后我必须展示他们所在的科目。

示例

现在你可以在下面看到我有学生名单,即学生1,学生2,等等。每个学生都有不同数量的科目 enter image description here

到目前为止我做了什么:

我创建了一个包含Label和Empty垂直stackview的Custom单元格。

然后在方法 tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) 我运行for循环,动态生成一些UiLabel并将它们添加到垂直stackview

问题:通过这样做,我得到了我想要的东西。但是当我向上和向下滚动时,for循环会在每次向上/向下滚动时一次又一次地重复单元格中的数据

如果还有其他方法,请提供帮助。

3 个答案:

答案 0 :(得分:1)

您可以将tableview与section。

一起使用
  1. 部分设置学生姓名
  2. 在单元格中设置主题
  3. 这是tableview的部分示例。 https://blog.apoorvmote.com/uitableview-with-multiple-sections-ios-swift/

    以下是供您参考的示例代码。

    class TableViewController: UITableViewController {
    
    let section = ["pizza", "deep dish pizza", "calzone"]
    
    let items = [["Margarita", "BBQ Chicken", "Pepperoni"], ["sausage", "meat lovers", "veggie lovers"], ["sausage", "chicken pesto", "prawns", "mushrooms"]]
    // MARK: - Table view data source
    
    override func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    
    return self.section\[section\]
    
    }
    
    override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
     // #warning Incomplete implementation, return the number of sections
    
    return self.section.count
    
    }
    
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
     // #warning Incomplete implementation, return the number of rows
    
    return self.items\[section\].count
    
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
     let cell = tableView.dequeueReusableCellWithIdentifier("tableCell", forIndexPath: indexPath)
    
    // Configure the cell...
    
    cell.textLabel?.text = self.items[indexPath.section][indexPath.row]
    
    return cell
    
    }
    

    更新

    自定义剖面视图 创建自定义视图并将视图显示为

    部分
    override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    
        let view = UIView(frame: CGRect(x:0, y:0, width:tableView.frame.size.width, height:18))
        let label = UILabel(frame: CGRect(x:10, y:5, width:tableView.frame.size.width, height:18))
        label.font = UIFont.systemFont(ofSize: 14)
        label.text = "This is a test";
        view.addSubview(label);
        view.backgroundColor = UIColor.gray;
        return view
    
    }
    

    Sample code for Customised section

    更新2

    引用单元格的自定义标题

    override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let  headerCell = tableView.dequeueReusableCellWithIdentifier("HeaderCell") as! CustomHeaderCell
        headerCell.backgroundColor = UIColor.cyanColor()
    
        switch (section) {
        case 0:
          headerCell.headerLabel.text = "Student Name 1";
          //return sectionHeaderView
        case 1:
          headerCell.headerLabel.text = "Student Name 2";
          //return sectionHeaderView
        case 2:
          headerCell.headerLabel.text = "Student Name 3";
          //return sectionHeaderView
        default:
          headerCell.headerLabel.text = "Other";
        }
    
        return headerCell
      }
    

答案 1 :(得分:0)

您可以尝试不同的方法。制作一个包含部分数量的列表=学生数量。每个部分的行数应等于该学生的主题。这可以通过制作具有主题数组作为其属性的学生模型来轻松实现。

class Student: NSObject {
    var subjectsArray : [String] = []
}

答案 2 :(得分:0)

首先将此扩展名添加到源代码中。

extension UIStackView{
    func removeAllArrangedSubviews() {
        let removedSubviews = arrangedSubviews.reduce([]) { (allSubviews, subview) -> [UIView] in
            removeArrangedSubview(subview)
            return allSubviews + [subview]
        }
        removedSubviews.forEach({ $0.removeFromSuperview() })
    }
}

现在在您的自定义单元格类中重写此方法。它将在重用之前从stackview中删除所有子视图。

override func prepareForReuse() {
    super.prepareForReuse()
    self.stackView.removeAllArrangedSubviews()
}