如何以编程方式删除表格视图单元格中的 UIView?

Posted

技术标签:

【中文标题】如何以编程方式删除表格视图单元格中的 UIView?【英文标题】:how to remove an UIView in the table view cell programatically? 【发布时间】:2018-05-18 02:42:16 【问题描述】:

我有一个像上图一样的表格视图单元格。我为公寓的租户制作了一个应用程序来报告房间设施的缺陷。如果缺陷已修复,来自服务器的数据将给出defect.status == 2(如果defect.status == 1,仍处于待修复过程中),届时我将显示用户的评论/回复,如果他们满意与否.在他们通过按“是”或“否”做出响应后。 UIView 应该被删除,我的意思是 UIView 包含“你满意”标签和如下所示的 Yes No Button 并且不会再次出现

我在 indexPath 方法的 cellForRow 中使用下面的代码

if dataDefect.status == 2 
   cell.commentResponseView.removeFromSuperview()

但我发现错误为零

这是我在视图控制器中的代码:

extension RequestDefectVC : UITableViewDataSource 

     //MARK: Table View Delegate & Datasource

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        return listDefects.count
    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "defectCell", for: indexPath) as! RequestDefectCell

        let dataDefect = listDefects[indexPath.row]
        cell.defectData = dataDefect

        if dataDefect.status == 3 
            cell.commentResponseView.removeFromSuperview()
        

        // to implement button delegate on RequestDefectCell Delegate
        cell.cellYesButtonDelegate = self
        cell.cellNoButtonDelegate = self
        cell.tag = indexPath.row

        return cell
    


这是我的表格视图单元格中的代码:

protocol RequestDefectCellYesButtonDelegate : class 
    func yesButtonDidPressed(defectID: Int)


protocol RequestDefectCellNoButtonDelegate : class 
    func noButtonDidPressed(defectID: Int)


class RequestDefectCell: UITableViewCell 

    @IBOutlet weak var defectImageView: DesignableImageView!
    @IBOutlet weak var defectStatusLabel: UILabel!
    @IBOutlet weak var defectCreationDateLabel: UILabel!
    @IBOutlet weak var unitLabel: UILabel!
    @IBOutlet weak var defectDescriptionLabel: UILabel!
    @IBOutlet weak var commentResponseView: UIView!
    @IBOutlet weak var defectStatusLogo: UIImageView!

    weak var cellYesButtonDelegate: RequestDefectCellYesButtonDelegate?
    weak var cellNoButtonDelegate: RequestDefectCellNoButtonDelegate?



    @IBAction func yesButtonDidPressed(_ sender: Any) 
        guard let defectData = defectData else return
        cellYesButtonDelegate?.yesButtonDidPressed(defectID: defectData.defectID)
    


    @IBAction func noButtonDidPressed(_ sender: Any) 
         guard let defectData = defectData else return
        cellNoButtonDelegate?.noButtonDidPressed(defectID: defectData.defectID)
    






我知道它可能会,因为我已经将它连接到单元格

 @IBOutlet weak var commentResponseView: UIView!

但如果我不连接,我没有任何其他想法

【问题讨论】:

commentResponseView 连接到插座检查一下 也可以根据状态显示/隐藏查看 感谢您的回答 Darwish,但我需要将其从超级视图中删除,因为如果我只是隐藏它,它将在标签“Keran Patah”与表格视图单元格的底部视图之间保留一个空格. commentResponseView 为什么你的单元格中没有连接到 IBoutlet 为什么不改变表格视图后面的数据呢?要么从listDefects 中删除条目,要么设置一些东西来表明缺陷已得到修复。那么您需要做的就是致电reloadData? 【参考方案1】:

您可以隐藏视图而不是从单元格中删除,因为它会在滚动时重复使用。

   if dataDefect.status == 3 
          if let wantToRemoveView = cell.commentResponseView
                 wantToRemoveView.removeFromSuperview()// OR wantToRemoveView.isHidden = true
                
            

【讨论】:

【参考方案2】:

如果您在用户对这些“是”或“否”按钮进行操作后收到该错误,那么这可能是因为您调用了 removeFromSuperview() 而没有检查它是否已被删除。

因为对于UITableView,如果您调用了reloadData 或任何其他调用您的cellForRowAt indexPath 方法的方法,那么它将为该视图找到nil,因为它已在cellForRowAt indexPath 的先前迭代中被删除.

因此,一种解决方案是检查您在cellForRowAt indexPath 方法中的视图是否已被删除,如下所示:

if dataDefect.status == 3 && cell.commentResponseView != nil 
    cell.commentResponseView.removeFromSuperview()

另一种解决方案是以这种方式设置约束,如果您将commentResponseView 的高度约束设置为 0,这会将其隐藏在您的 UITableViewCell 之外,然后在特定条件下将其设置为 0 在您的 cellForRowAt indexPath而不是从UITableViewCell 中删除该视图。所以其余的视图将被自动管理。

【讨论】:

【参考方案3】:

试试这个代码

目标 c

[[cell. commentResponseView viewWithTag:MY_CUSTOM_TAG]removeFromSuperview] ;

迅速

cell.commentResponseView.viewWithTag(MY_CUSTOM_TAG)?.removeFromSuperview()

另一种方法是隐藏相应单元格的commentResponseView,然后更改它的约束值

【讨论】:

以上是关于如何以编程方式删除表格视图单元格中的 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式开始在另一个表格视图单元格中编辑 UITextField

在表格视图单元格中以编程方式显示图像

表格视图单元格中的堆栈视图

如何以编程方式使用原型单元格删除表格视图部分标题

如何以编程方式更改表格单元格中单选按钮组的单选按钮?

以编程方式动态调整多行 UILabel 和随附的表格视图单元格