微调器不想从超级视图中删除

Posted

技术标签:

【中文标题】微调器不想从超级视图中删除【英文标题】:Spinner don't want to remove from superview 【发布时间】:2020-05-22 16:38:37 【问题描述】:

我有一个 UIActivityIndi​​catorView,所以当我尝试在搜索栏中搜索时,它会在数据进入之前先加载。我在 UIViewController 扩展中制作微调器以进行动画处理并从视图中删除动画。但不知何故,当我尝试使用断点时,我无法弄清楚为什么我要删除的视图没有被删除。我创建的函数dismissLoading没有被调用,为什么会发生?有人能帮我吗。这是我的代码

fileprivate var containerView: UIView!

extension UIViewController 

    func showLoadingView() 
        containerView = UIView(frame: view.bounds)
        view.addSubview(containerView)

        containerView.backgroundColor   = .systemBackground
        containerView.alpha             = 0.0

        UIView.animate(withDuration: 0.25)  containerView.alpha = 0.8 

        let activityIndicator = UIActivityIndicatorView(style: .large)
        containerView.addSubview(activityIndicator)

        activityIndicator.translatesAutoresizingMaskIntoConstraints = false

        NSLayoutConstraint.activate([
            activityIndicator.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            activityIndicator.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])

        activityIndicator.startAnimating()
    

    func dismissLoadingView() 
        DispatchQueue.main.async 
            containerView.removeFromSuperview()
            containerView = nil
        
    


// This is my PhotosViewController 
extension PhotosViewController: UISearchResultsUpdating 
    func updateSearchResults(for searchController: UISearchController) 
        guard let searchText = searchController.searchBar.text, !searchText.isEmpty else 
            dataSource.data.value.removeAll()
            viewModel.isSearching.value = false
            return
        

        photoName = searchText

        viewModel.isSearching.value = true
        showLoadingView()
        if let photoName = photoName 
            viewModel.getPhoto(query: photoName)  [weak self] error in
                self?.dismissLoadingView()
                print(error)
            
        
    

【问题讨论】:

尝试打印self以及里面的错误和getPhoto告诉我你得到了什么。 @Frankenstein 没有打印任何东西,我在尝试打印时使用断点(self)和错误 【参考方案1】:

您没有看到它消失,因为每次搜索查询更改时,您都在添加容器视图和活动指示器的新实例。如果在第一个查询返回结果之前查询第二次更新,对您的第一个 containerView 的引用将被重新分配给一个新的视图实例。

如果您尝试通过在呈现之前检查 containerView == nil 来解决此问题,如果您有多个搜索结果请求发出,一个返回,然后加载视图被关闭,尽管还有其他请求发出,您也会遇到问题。

【讨论】:

是的,当我尝试按照您的建议进行检查时。加载似乎有一段时间比在透明背景下再次加载更容易了,而且它并没有停止。之后怎么删除呢?

以上是关于微调器不想从超级视图中删除的主要内容,如果未能解决你的问题,请参考以下文章

移除单元格附件后,如何将微调器与单元格内容视图居中?

在android的微调器中设置视图文本在中心对齐

如何在运行时从超级视图中删除视图?

如何从超级视图中删除视图?

从超级视图中删除当前视图

足以从超级视图中删除视图?