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

Posted

技术标签:

【中文标题】Swift3:UITableViewCell 和 UIButton - 通过单击 UIButton 显示和隐藏 UITableViewCell【英文标题】:Swift3: UITableViewCell and UIButton - Show and hide UITableViewCell by clicking the UIButton 【发布时间】:2016-12-23 09:23:12 【问题描述】:

我对@9​​87654323@ 还很陌生,目前正在开发一个关于 ios 应用的学校项目。

我在链接UITableViewCellUIButton 时遇到了困难。

This is how my app looks like

基本上,我想要做的是,当我单击 UIButton 时,它会将单元格(日记和趋势)的高度降低到 0(隐藏单元格) 和 增加单元格的高度(共享和如何使用 BP 监视器)(以显示单元格) - 假设单元格(共享和如何使用 BP 监视器)现在是“隐藏”的。

如果有可以效仿的例子,请欣赏。

非常感谢:)

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

这是我的 ViewController 中的代码:

类 TableViewController: UITableViewController var expandCellIndex : 索引路径? = 无

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

非常感谢!

【问题讨论】:

您遇到了什么问题?您可以根据需要增加行高 是的,你可以做到 在 indexPath 处实现行的高度,在点击按钮时要求 tableView 重新加载。索引路径处的行的高度根据按钮状态返回高度 要扩展单元格吗?如果只增加高度,您可以设置一个参数,当您单击按钮时,该参数设置单元格的高度 @TinuDahiya 我的问题是我不确定如何在单击按钮时对该部分进行编码,它会调用该函数来增加单元格的高度。 【参考方案1】:

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

第 1 步:

在故事板中声明两个动态原型单元。

我们将红色的称为 SimpleCell,将绿色的称为 ExpandedCell。

第 2 步:

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

第 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(in 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()

结论:

免责声明

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

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

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

【讨论】:

非常感谢您的回复!对于我的代码,我没有使用原型细胞。这个答案适用于非原型细胞吗? 不使用原型单元是什么意思?您必须在 tableview 中有单元格,或者您必须在单元格中有 xibs 无论如何在所有情况下它都有效:) 我已经尝试过您的答案,但无法显示绿色单元格中的 3 个标签。 我可以在哪里分享代码?太长了,无法在评论中粘贴。 编辑您的问题好友并仅粘贴重要的方法,例如 tableview 的代表,您的逻辑以查找点击的按钮,然后您在哪里重新加载类似的 tableview 内容:D

以上是关于Swift3:UITableViewCell 和 UIButton - 通过单击 UIButton 显示和隐藏 UITableViewCell的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 - 从 xib 加载的 UITableViewCell - 自动布局和高度不正确

从另一个视图控制器单击 uitableviewcell 后,swift 3 更改 uitableviewcell?

想知道如何以编程方式在 swift 3.0 中对 UITableViewCell 进行子类化?

Swift 3:TPKeyboardAvoidingScrollView 在 UITableViewCell 中的一个 UITextField 上无法正常工作

Swift 3:在 uitableviewcell 中删除重复项/将它们分组为 1

UITableViewCell TopLeft 和 BottomLeft 角不起作用