【问题标题】:Activity indicator not showing when executed执行时不显示活动指示器
【发布时间】:2016-01-06 17:41:38
【问题描述】:

我试图在用户点击登录按钮时显示活动指示器。如果我将startActivityIndicator() 代码放在viewDidLoad() 中,它会完全按预期显示在屏幕上。当我作为btnSignIn() 的第一步执行它时,它永远不会出现。有点失落,所以我希望堆栈大师能提供帮助......

// Here are the variable declarations
var activityIndicator: UIActivityIndicatorView = UIActivityIndicatorView()
var loadingView: UIView = UIView()
var viewCenter:CGPoint!

@IBAction func btnSignIn(sender: AnyObject) {

    startActivityIndicator()

    if validateEmailAddress(txtEmailAddress.text!) == false {
        stopActivityIndicator(self.loadingView)
        return
    }

    if validatePassword(txtPassword.text!) == false {
        stopActivityIndicator(self.loadingView)
        return
    }

    PFUser.logInWithUsernameInBackground(txtEmailAddress.text!, password:txtPassword.text!) {
        (user: PFUser?, error: NSError?) -> Void in
        if user != nil {

            // Successful login.
            self.txtPassword.resignFirstResponder()
            self.txtEmailAddress.resignFirstResponder()

            self.getUserInfo()

        } else {
            self.stopActivityIndicator(self.loadingView)
            // The login failed. Display alert.
            self.displayAlert("Whoops!", message: "Email or Password are incorrect.")
        }
    }
}

func startActivityIndicator() {

    loadingView.frame = CGRectMake(0, 0, 80, 80)
    loadingView.center = viewCenter
    print(viewCenter)
    loadingView.backgroundColor = UIColorFromRGB("444444", alpha: 0.7)
    loadingView.clipsToBounds = true
    loadingView.layer.cornerRadius = 10

    activityIndicator.frame = CGRectMake(0.0, 0.0, 40.0, 40.0);
    activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyle.WhiteLarge
    activityIndicator.center = CGPointMake(loadingView.frame.size.width / 2, loadingView.frame.size.height / 2);

    view.addSubview(loadingView)
    loadingView.addSubview(activityIndicator)

    UIApplication.sharedApplication().beginIgnoringInteractionEvents()

    activityIndicator.startAnimating()

}

func stopActivityIndicator(uiView: UIView) {

    activityIndicator.stopAnimating()
    loadingView.removeFromSuperview()
    UIApplication.sharedApplication().endIgnoringInteractionEvents()
}

【问题讨论】:

  • @AnthonyDito UIActivityIndi​​catorView 没有方法 startActivityIndi​​cator()
  • @AnthonyDito 我想这就是你的意思。不过他已经在调用那个方法了。
  • 这很奇怪......像我在这里所做的那样从viewDidLoad() 调用该方法没有问题。
  • 您确定在调用 Parse 之前没有遇到两个条件之一吗?你用断点测试了吗?
  • 是的,我设置了断点以确保它不是他,以及一个断点以确保活动指示器代码正在执行。

标签: ios swift uiactivityindicatorview


【解决方案1】:

使用我的delay 实用程序(参见此处:https://stackoverflow.com/a/24318861/341994),像这样重写:

@IBAction func btnSignIn(sender: AnyObject) {
    startActivityIndicator()
    delay(0.1) {
        if validateEmailAddress(txtEmailAddress.text!) == false {
        // ... everything else goes here ...
    }
}

延迟使活动指示器有机会出现并开始旋转。

【讨论】:

  • 这是这样做的方法。
  • 你现在只是在炫耀@matt :) 工作完美。你知道我为什么需要延迟吗?除了解决我的问题,我还在努力学习。
  • 我当然知道为什么。你也一样。您自己在评论中给出了原因。
  • 我假设您的意思是“刷新”评论,但我确认 startActivityIndi​​cator 在第一次验证检查开始之前完成。我意识到你有更好的事情要做,还有更多的人要拯救:) 如果你有时间解释一下,太好了。如果没有,不用担心,再次感谢!
  • 我已经写了一整本书来向您解释这一点。 :) apeth.com/iOSBook/ch17.html#_drawing_animation_and_threading 延迟让重绘时刻(当前事务的结束)有机会显示活动指示器并开始在动画服务器线程上旋转。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多