【问题标题】:Consistently show loader on back button click在后退按钮单击时始终显示加载程序
【发布时间】:2019-11-27 06:28:29
【问题描述】:

我正在为导航返回操作创建一个自定义按钮。并在后退按钮单击时,推送未推送的不同视图控制器。后面的动作工作正常,但显示的加载器并不一致。这种情况下的最佳做法是什么?

后退代码如下:

@objc func backAction() -> Void {
    self.showLoader { (status) in
        if status {
            DispatchQueue.main.async {                    
                if let viewController = UIStoryboard(name: DFViewControllerNameConstant.MAIN, bundle: nil).instantiateViewController(withIdentifier: DFViewControllerNameConstant.DF_PREVIEW_ALL_TOUR_VIEW_CONTROLLER) as? DFPreviewAllPublishedCapturePanoramaViewController {
                    if let navigator = self.navigationController {
                        navigator.pushViewController(viewController, animated: true)
                    }
                }
            }
        }
    }
}

Show and remove loader 的代码是:

import UIKit
fileprivate var loaderView: UIView?

extension UIViewController {
    func showLoader(completion: @escaping ((Bool)->())) {
        loaderView = UIView(frame: self.view.bounds)
        loaderView?.backgroundColor = UIColor.init(red: 0.4, green: 0.4, blue: 0.4, alpha: 0.4)
        let loader = UIActivityIndicatorView(style: .white)
        loader.center = loaderView!.center
        loader.startAnimating()
        loaderView?.addSubview(loader)
        self.view.addSubview(loaderView!)
        UIApplication.shared.beginIgnoringInteractionEvents()
        completion(true)
    }

    func removeLoader() {
        loaderView?.removeFromSuperview()
        loaderView = nil
        UIApplication.shared.endIgnoringInteractionEvents()
    }
}

【问题讨论】:

  • 请检查您的self.navigationController 不能为nil 吗?
  • 感谢重播,检查 self.navigationController != nil 不工作。我遇到了加载器显示不一致的问题,推送视图控制器工作正常。
  • 一致的意思?你能详细说明一下吗?
  • @SohilR.Memon 一致意味着每次单击后退按钮加载器视图时都应该显示。但就我而言,它有时会显示,有时不会。

标签: ios xcode11 swift5


【解决方案1】:

如果您想始终如一地显示加载器,您应该将 Activity IndicatorView 添加到您的应用程序窗口,而不是特定的视图控制器的视图。

类似这样的东西 - (UIApplication.shared.delegate as!AppDelegate).window?.addSubview()

【讨论】:

  • 尝试了您的解决方案,但仍然不一致。
【解决方案2】:

通过以下方式更改 backAction() 已解决问题:

    @objc func backAction() -> Void {
        DispatchQueue.main.async {
            self.showLoader()
            DispatchQueue.main.async {
                if let viewController = UIStoryboard(name: DFViewControllerNameConstant.MAIN, bundle: nil).instantiateViewController(withIdentifier: DFViewControllerNameConstant.DF_PREVIEW_ALL_TOUR_VIEW_CONTROLLER) as? DFPreviewAllPublishedCapturePanoramaViewController {
                    DispatchQueue.main.async {
                        if let navigator = self.navigationController {
                            navigator.pushViewController(viewController, animated: true)
                        }
                    }
                }
            }
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多