搅拌器不想从监控中移除

问题描述 投票:0回答:1

我有一个UIActivityIndicatorView,所以当我尝试在搜索栏中搜索时,它会在数据进来之前先加载。我在UIViewController扩展中制作了动画的spinner,并将动画从视图中移除,但不知为何我想移除的视图没有被移除,当我尝试使用断点时,我创建的函数disselLoading没有被调用,为什么会发生这种情况?

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)
            }
        }
    }
}
ios swift uiview uiactivityindicatorview
1个回答
1
投票

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

如果您试图通过检查是否 containerView == nil 在呈现之前,如果你有多个搜索结果请求出来,一个返回,然后尽管有其他请求出来,但加载视图却被驳回,你也会遇到问题。

© www.soinside.com 2019 - 2024. All rights reserved.