来自应用委托的停止动画活动指示器
Posted
技术标签:
【中文标题】来自应用委托的停止动画活动指示器【英文标题】:stopAnimating activity indicator from app delegate 【发布时间】:2017-09-17 11:37:35 【问题描述】:我无法从我的应用委托中的某个函数停止活动指示器,我知道该函数正在被调用,但我的日志中没有收到任何错误。
我正在像这样在我的 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 确实有效,但活动指示器仍在运行
我对 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()
【讨论】:
以上是关于来自应用委托的停止动画活动指示器的主要内容,如果未能解决你的问题,请参考以下文章
UIActivityIndicatorView 随机停止动画