removeFromSuperview 不适用于 UIImageView

Posted

技术标签:

【中文标题】removeFromSuperview 不适用于 UIImageView【英文标题】:removeFromSuperview doesn't work with UIImageView 【发布时间】:2018-04-23 22:17:10 【问题描述】:

如果计数为零,我通过以下代码将图像添加到我的视图中,否则将其删除:

var coverImageView = UIImageView()

override func viewWillAppear(_ animated: Bool) 
    super.viewWillAppear(animated)

    if count == 0 
        let coverImage = UIImage(named: "AddFirstRecord")!
        coverImageView = UIImageView(image: coverImage)
        coverImageView.frame = CGRect(x: 20, y: 5, width: tableView.frame.width-20, height: 100)
        view.addSubview(coverImageView)

     else 
        DispatchQueue.main.async 
            self.coverImageView.removeFromSuperview()
        
    

问题在于它将图像添加到视图中,但removeFromSuperview 不起作用。 (我通过调试确保它达到else 条件)。我也在主队列中完成了这个过程,以确保问题与线程无关。我想知道问题的根源在哪里?

【问题讨论】:

从其他控制器导航回同一个控制器后是否更新计数 【参考方案1】:

viewWillAppear 中,视图还没有完全准备好查看。所以 removeFromSuperview 没有任何效果。相反,我们应该在viewDidLayoutSubviews 中执行操作:

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()

    if fetchedResultsController.fetchedObjects?.count == 0 
        let coverImage = UIImage(named: "AddFirstRecord")!
        coverImageView.image = coverImage
        coverImageView.frame = CGRect(x: 20, y: 5, width: tableView.frame.width-20, height: 100)
        view.addSubview(coverImageView)

     else 
        coverImageView.removeFromSuperview()
    

来自Apple Documentation:

viewDidLayoutSubviews() 调用以通知视图控制器它的 view 刚刚布置了它的子视图。

您的视图控制器可以覆盖此方法以在之后进行更改 视图列出了它的子视图。这个的默认实现 方法什么都不做。

【讨论】:

以上是关于removeFromSuperview 不适用于 UIImageView的主要内容,如果未能解决你的问题,请参考以下文章

出口集合 removefromsuperview

removeFromSuperview 随机崩溃

removeFromSuperview() 耗时过长

removeFromSuperview() 并不总是有效

无法使用 removeFromSuperview 方法删除视图

关于removeFromSuperview