来自应用程序委托的停止动画 activity 指示器

stopAnimating activity indicator from app delegate

我无法从我的应用程序委托中的函数停止 activity 指示器,我知道该函数正在被调用,但我在日志中没有收到任何错误。

我正在我的 signInViewController 中创建 activityIndicator,就像这样

@IBAction func googleSignInButton(_ sender: Any) {

    GIDSignIn.sharedInstance().uiDelegate = self
    GIDSignIn.sharedInstance().signIn()


    activityIndicator.center = self.view.center
    activityIndicator.hidesWhenStopped = true
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.white
    view.addSubview(activityIndicator)

    activityIndicator.startAnimating()
    UIApplication.shared.beginIgnoringInteractionEvents()


}

在我的应用程序委托中我有这个功能,

   func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {

            print("this function is running")
            SignInViewController().stopanimating()

            // ...
            if error != nil {
                // ...


                return
            }

我知道这个函数工作正常,因为它在日志等中打印文本。并从 SignInViewController

调用此函数
func stopanimating() {
        print("stop animating function running")
        DispatchQueue.main.async {
            self.activityIndicator.stopAnimating()
            UIApplication.shared.endIgnoringInteractionEvents()
        }
    }

现在我知道这个函数是 运行,因为它还在日志中打印预期的文本,而且 endIgnoringInteractionEvents 确实有效,但 activity 指标仍然是 运行

我是 swift 的新手,但我之前在通过我的 appdelegate 操作视图控制器中的对象时遇到了问题,这可能吗?

提前致谢

您需要从子视图中删除 activity 指示器。 修改你的 stopanimating()

func stopanimating() {
        print("stop animating function running")
        DispatchQueue.main.async {
            self.activityIndicator.stopAnimating()
            self.activityIndicator.removeFromSuperview()
            UIApplication.shared.endIgnoringInteractionEvents()
        }
}

这是因为您正在 appDelegate 中创建 SignInViewController 的新实例。即SignInViewController().stopanimating()。您必须调用相同的实例才能停止动画显示 activity 指示器。

这是什么意思 -- SignInViewController()。这意味着您正在创建 SignInViewController 的不同实例,因此在此实例中您的 Activity 指标不存在。

解决方案 - 第一个解决方案是获取显示 activity 指标的实例。这意味着您必须在您的情况下获得 currentViewController Instance 。第二种解决方案是移动您的 func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) 将方法委托给您的 SignInViewController class。

当你这样做时:

SignInViewController().stopanimating()

您正在做的是创建一个新的 SignInViewController 并调用它的方法。你想要做的是让现有的停止动画。

一种方法是:

let vc = (GIDSignIn.sharedInstance().uiDelegate as! SignInViewController)
vc.stopanimating()

您以后可能想重构它,但这应该会让您走上正确的道路!