Swift3:UITableViewCell和UIButton - 单击UIButton显示和隐藏UITableViewCell

时间:2016-12-23 09:23:13

标签: ios uitableview button swift3 xcode8

我是Swift 3.0的新手,目前正在开设IOS应用的学校项目。

我在UITableViewCellUIButton的关联方面遇到了困难。

This is how my app looks like

基本上,我要做的是当我点击UIButton时,它会将单元格的高度(日记和趋势)降低到0(隐藏单元格) 和 增加细胞的高度(分享和如何使用血压监测仪)(显示细胞) - 假设细胞(分享和如何使用血压监测)现在被“隐藏”。

欣赏是否有一个例子可供遵循。

非常感谢:)

*在尝试@Sandeep Bhandari给出的例子之后

这是我的ViewController中的代码:

class TableViewController:UITableViewController {     var expandedCellIndex:IndexPath? = nil

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

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell : UITableViewCell! = nil
    if indexPath == expandedCellIndex {
        cell = tableView.dequeueReusableCell(withIdentifier: "expandedCell") as! ExpandedTableViewCell
        (cell as! ExpandedTableViewCell).label1.text = "shown"
        (cell as! ExpandedTableViewCell).label2.text = "Efgh"
        (cell as! ExpandedTableViewCell).label3.text = "xyz"
    }
    else {
        cell = tableView.dequeueReusableCell(withIdentifier: "simpleCell") as! SimpleTableViewCell
        (cell as! SimpleTableViewCell).label.text = "abcd"
    }
    return cell
}



override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if self.expandedCellIndex == indexPath {
        self.expandedCellIndex = nil
    }
    else {
        self.expandedCellIndex = indexPath
    }
    self.tableView.reloadData()
}



override func viewDidLoad() {
    super.viewDidLoad()
    tableView.rowHeight = UITableViewAutomaticDimension
    tableView.estimatedRowHeight = 140
}

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

我无法获得与建议的答案相同的输出。

My Output

非常感谢你!

1 个答案:

答案 0 :(得分:1)

这是一个简单的代码,它不仅可以扩展您可以扩展所有单元格的特定单元格。如果您只想扩展一个单元格,也可以这样做。

第1步:

在故事板中声明两个动态原型单元格。 enter image description here

让我们将红色调用为SimpleCell,将绿色调用为ExpandedCell。

第2步:

为每个单元格添加可重复使用的标识符。

enter image description here

enter image description here

第3步

为这两个单元格创建自定义类,并将IBOutlets创建为标签。

第4步:

现在在你的VC的ViewDidLoad中写这个。

override func viewDidLoad() {
        super.viewDidLoad()
        tableView.rowHeight = UITableViewAutomaticDimension
        tableView.estimatedRowHeight = 140
    }

第5步:

假设一次只能扩展一个单元格我声明单个IndexPathVariable,如果要扩展多个单元格,可以随时声明数组。

var expandedCellIndex : IndexPath? = nil

第6步:

编写tableView数据源代码。

覆盖func numberOfSections(在tableView:UITableView中) - > Int {         返回1     }

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    var cell : UITableViewCell! = nil
    if indexPath == expandedCellIndex {
        cell = tableView.dequeueReusableCell(withIdentifier: "expandedCell") as! ExpandedTableViewCell
        (cell as! ExpandedTableViewCell).label1.text = "abcd"
        (cell as! ExpandedTableViewCell).label2.text = "Efgh"
        (cell as! ExpandedTableViewCell).label3.text = "xyz"
    }
    else {
        cell = tableView.dequeueReusableCell(withIdentifier: "simpleCell") as! SimpleTableViewCell
        (cell as! SimpleTableViewCell).label.text = "abcd"
    }
    return cell
}

第7步:

我正在细胞水龙头上扩展细胞你可以在按钮上点击它:)在IBAction中按钮lemme写这个逻辑把它写在didSelectRow中。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if self.expandedCellIndex == indexPath {
        self.expandedCellIndex = nil
    }
    else {
        self.expandedCellIndex = indexPath
    }
    self.tableView.reloadData()
}

结论:

enter image description here

enter image description here

<强>声明

我正在使用动态单元格高度,因此没有写入heightForRowAtIndexPath,因为将自动计算单元格的高度。

如果您在没有隐式大小的单元格中使用任何UIComponents,则可能必须实现heightForRowAtIndexPath,如下所示。

override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
    if self.expandedCellIndex == indexPath {
        return expnadedCellHeight
    }
    else {
        return simpleCellHeight
    }
}