我遇到了从我的app委托中的某个函数停止活动指示器的麻烦,我知道该函数已被调用,但我没有收到我日志中的任何错误。
我在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()
}
在我的app委托之后,我有这个功能,
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操作viewcontrollers中的对象时遇到了问题,这可能吗?
提前致谢
答案 0 :(得分:2)
这是因为您正在appDelegate中创建SignInViewController的新实例。那是SignInViewController().stopanimating()
。您必须调用相同的实例才能停止为活动指示器设置动画。
答案 1 :(得分:1)
这意味着什么 - SignInViewController()
。这意味着您正在创建SignInViewController
的不同实例,因此在此实例中,您的活动指示器不存在。
解决方案 - 首先解决方案是获取显示活动指标的实例。这意味着你必须得到currentViewController Instance。第二个解决方案是移动你的
func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?)
委托方法到SignInViewController
班。
答案 2 :(得分:1)
当你这样做时:
SignInViewController().stopanimating()
您正在做的是创建一个新的SignInViewController并在其上调用该方法。你想要做的是获得现有的停止动画。
一种方法是:
let vc = (GIDSignIn.sharedInstance().uiDelegate as! SignInViewController)
vc.stopanimating()
您可能希望稍后重构,但这应该让您走上正确的道路!
答案 3 :(得分:0)
您需要从子视图中删除活动指示符。 修改您的stopanimating()
func stopanimating() {
print("stop animating function running")
DispatchQueue.main.async {
self.activityIndicator.stopAnimating()
self.activityIndicator.removeFromSuperview()
UIApplication.shared.endIgnoringInteractionEvents()
}
}