来自应用委托的停止动画活动指示器

Posted

技术标签:

【中文标题】来自应用委托的停止动画活动指示器【英文标题】:stopAnimating activity indicator from app delegate 【发布时间】:2017-09-17 11:37:35 【问题描述】:

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

我正在像这样在我的 signInViewController 中创建 activityIndi​​cator

@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 确实有效,但活动指示器仍在运行

我对 swift 很陌生,但之前从我的 appdelegate 操作视图控制器中的对象时遇到问题,这可能吗?

提前致谢

【问题讨论】:

首先确保执行顺序是 current 。如果您尝试以异步方式从您的应用委托委托中禁用动画。它可能会在开始动画之前被调用。其次,我可能是错的,但看起来您在尝试禁用动画时使用的是类而不是视图控制器的实例。是故意的吗? 【参考方案1】:

这是因为您在 appDelegate 中创建了一个新的 SignInViewController 实例。那是SignInViewController().stopanimating()。您必须调用相同的实例才能停止为活动指示器设置动画。

【讨论】:

很好的解释。因此 +1 。我也发布了解决方案。【参考方案2】:

当你这样做时:

SignInViewController().stopanimating()

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

一种方法是:

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

您可能希望稍后对其进行重构,但这应该会让您走上正确的道路!

【讨论】:

【参考方案3】:

这是什么意思——SignInViewController()。这意味着您正在创建 SignInViewController 的不同实例,因此在此实例上您的活动指示器不存在。

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于来自应用委托的停止动画活动指示器的主要内容,如果未能解决你的问题,请参考以下文章

GWT MAP 中的活动指示器

UIActivityIndi​​catorView 随机停止动画

你好。我正在使用 Xcode 开发应用程序。 WKWebView 中的活动指示器在加载内容后保持旋转并且不停止或消失

核心动画的使用 - 活动指示器

无法让自定义活动指示器设置动画

无法让自定义的活动指示器生成动画