ios - spinnerView 无法在 appdelegate 中工作

标签 ios iphone xcode swift progress-bar

您好,我在这里使用 appdeligate 来执行某些特定方法,例如登录应用程序和从应用程序注销。 这里我有一个代码 目前效果很好,但问题是当登录请求发送到服务器时,旋转 View 无法工作

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.
    spinnerInitialization();
     email = NSUserDefaults.standardUserDefaults().stringForKey("email")\\Getting Email from local storage 
     password = NSUserDefaults.standardUserDefaults().stringForKey("password")\\\\Getting Password from local storage
    if ((email == nil) && (password == nil)){

    }
    else if ((email == "") && (password == "")) {

   }
    else {
        loginRequest(email!, password: password!)
    }

    return true

}

接下来是登录功能

    func loginRequest( var email: String,password: String){

    let request = NSMutableURLRequest(URL: NSURL(string: "www.example.com/login")!)
    request.HTTPMethod = "POST"
    let postString = "email=\(email)&password=\(password)&token=\("ttttttt")"

    dispatch_async(dispatch_get_main_queue()) {
        self.startSpinner()
    }

    request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding)
    let task = NSURLSession.sharedSession().dataTaskWithRequest(request){
        data, response, error in
        if(error != nil){

            let nsError = error! as NSError
            let dialog = UIAlertController(title: "Internal Server Error?", message: nsError.localizedDescription, preferredStyle: UIAlertControllerStyle.Alert);

            let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default){(ACTION) in

                print("Ok Button Action ")
            }

            dialog.addAction(okAction);

            dispatch_async(dispatch_get_main_queue(), {
                //Code that presents or dismisses a view controller here
                self.window?.rootViewController?.presentViewController(dialog, animated: true, completion: nil)
            })
        }

        else{
        do {
            let json = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments)

            let status  = json["status"]as? Int
            let message = json["message"]as? String

            if(status == 0){


                let dialog = UIAlertController(title: "Login Unsuccessful?", message: message, preferredStyle: UIAlertControllerStyle.Alert);

                let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default){(ACTION) in

                    print("Ok Button Action ")
                }

                dialog.addAction(okAction);

                dispatch_async(dispatch_get_main_queue(), {

                    self.window?.rootViewController?.presentViewController(dialog, animated: true, completion: nil)

                })


            }
            else
            {
                let newModel = UserDetails()
                let result = json["data"]
                let userId = result!!["id"] as? String
                let companyId = result!!["companyId"] as? String
                let name = result!!["name"] as? String
                let companyName = result!!["companyName"] as? String
                email = (result!!["email"] as? String)!
                let userType = result!!["userType"] as? String

                NSUserDefaults.standardUserDefaults().setObject(email, forKey: "email")
                NSUserDefaults.standardUserDefaults().setObject(userId, forKey: "userId")
                NSUserDefaults.standardUserDefaults().setObject(companyId, forKey: "companyId")
                NSUserDefaults.standardUserDefaults().setObject(name, forKey: "name")
                NSUserDefaults.standardUserDefaults().setObject(companyName, forKey: "companyName")
                NSUserDefaults.standardUserDefaults().setObject(userType, forKey: "userType")
                NSUserDefaults.standardUserDefaults().setObject(password, forKey: "password")
                NSUserDefaults.standardUserDefaults().setObject("afdg2015", forKey: "token")

                newModel.userId = userId!
                newModel.companyId = companyId!
                newModel.userName = name!
                newModel.companyName = companyName!

                if userType == "0"{
                    newModel.asEmployeer = true
                    NSUserDefaults.standardUserDefaults().setObject("true", forKey: "asEmployeer")
                    NSNotificationCenter.defaultCenter().postNotificationName("load", object: nil)
                }
                else {
                    newModel.asEmployeer = false
                    NSUserDefaults.standardUserDefaults().setObject("false", forKey: "asEmployeer")
                    NSNotificationCenter.defaultCenter().postNotificationName("load", object: nil)
                }

                self.userDetails.append(newModel)

                dispatch_async(dispatch_get_main_queue()) {

                    let storyboard = UIStoryboard(name: "Main", bundle: nil)
                    var scheduleController = storyboard.instantiateViewControllerWithIdentifier("scheduleHome100")
                    if (newModel.asEmployeer == false){
                    //EmployeeScheduleViewController
                         scheduleController = storyboard.instantiateViewControllerWithIdentifier("EmployeeScheduleViewController")
                    }

                    let drawerViewController = storyboard.instantiateViewControllerWithIdentifier("DrawerViewController")

                    let leftSideNav = UINavigationController(rootViewController: drawerViewController)
                    let centerNav = UINavigationController(rootViewController: scheduleController)

                    self.centerContainer = MMDrawerController(centerViewController: centerNav, leftDrawerViewController: leftSideNav)
                    self.centerContainer!.openDrawerGestureModeMask = MMOpenDrawerGestureMode.PanningCenterView;
                    self.centerContainer!.closeDrawerGestureModeMask = MMCloseDrawerGestureMode.PanningCenterView;

                    self.window!.rootViewController = self.centerContainer
                    self.window!.makeKeyAndVisible()
                }
            }

        } catch {
            print("error serializing JSON: \(error)")
        }
            dispatch_async(dispatch_get_main_queue(), {
                self.stopSpinner()
            })
        }
    }

    task.resume();
}

接下来是微调功能

func startSpinner(){
    print("In startSpinner Function")
    view.addSubview(spinnerView)
}

func stopSpinner(){
    print("In stopSpinner Function")
    let subViews = view.subviews
    for subView in subViews{
        if subView.tag == 1000{
            subView.removeFromSuperview()
        }

    }
}

func spinnerInitialization(){
    print("In spinnerInitialization Function")
    spinnerView = UIView(frame: CGRect(x:0, y:0,width: 250,height: 50))
    spinnerView.backgroundColor = UIColor.blackColor()
    spinnerView.layer.cornerRadius = 10
    let wait = UIActivityIndicatorView(frame: CGRect(x:0,y: 0,width: 50,height: 50))
    wait.color = UIColor.whiteColor()
    wait.hidesWhenStopped = false
    wait.startAnimating()
    let text = UILabel(frame: CGRect(x:60,y:0,width:200,height: 50))
    text.textColor = UIColor.whiteColor()
    text.text = "Please wait..."
    spinnerView.addSubview(wait)
    spinnerView.addSubview(text)
    spinnerView.center = view.center
    spinnerView.tag = 1000
}

更新 当我像这样从 ViewController 发送请求时

  @IBAction func loginAction(sender: AnyObject) {
    let email = textEmail.text
    let password = textPassword.text
    spinnerInitialization()
    startSpinner()
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    appDelegate.loginRequest(email!, password: password!)
}

func spinnerInitialization(){
    spinnerView = UIView(frame: CGRect(x:0, y:0,width: 250,height: 50))
    spinnerView.backgroundColor = UIColor.blackColor()
    spinnerView.layer.cornerRadius = 10
    let wait = UIActivityIndicatorView(frame: CGRect(x:0,y: 0,width: 50,height: 50))
    wait.color = UIColor.whiteColor()
    wait.hidesWhenStopped = false
    wait.startAnimating()
    let text = UILabel(frame: CGRect(x:60,y:0,width:200,height: 50))
    text.textColor = UIColor.whiteColor()
    text.text = "Please wait..."
    spinnerView.addSubview(wait)
    spinnerView.addSubview(text)
    spinnerView.center = self.view.center
    spinnerView.tag = 1000
}

func startSpinner(){
    view.addSubview(spinnerView)
}

func stopSpinner(){
    let subViews = view.subviews
    for subView in subViews{
        if subView.tag == 1000{
            subView.removeFromSuperview()
        }

    }
}

然后微调器显示

请帮我解决这个问题 谢谢

最佳答案

您正在执行dataTaskWithRequest,这是一个异步流程。您必须添加一个完成处理程序,以便您的函数等待该过程完成,如下所示:

    func loginRequest( var email: String,password: String ,complete: (evalSuccess: Bool) -> ()){

///Your code:

     if(status == 0){


                    let dialog = UIAlertController(title: "Login Unsuccessful?", message: message, preferredStyle: UIAlertControllerStyle.Alert);

                    let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.Default){(ACTION) in

                        print("Ok Button Action ")
                    }

                    dialog.addAction(okAction);

                    dispatch_async(dispatch_get_main_queue(), {

                        self.window?.rootViewController?.presentViewController(dialog, animated: true, completion: nil)

                    })


                }
                else
                {
                  complete(evalSuccess: True)
                    let newModel..
               ///your code

             }

然后在 appDelegate 中调用它,如下所示:

loginRequest(youremail, yourpassword){success in
if success{
//Do something
}

}

关于ios - spinnerView 无法在 appdelegate 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37915946/

相关文章:

iOS CGContextAddArc 和不同的屏幕分辨率

ios - 从 presentModalViewController 推送 uiviewcontroller

ios - 快速生成带有参数倾斜值数据的 UIColor

objective-c - 如何在 x86_64 Swift 项目中使用 i386 框架

iphone - 按下按钮并转到 Xcode 中的随机 View

ios - 为什么 XCode 启动应用程序两次以运行 UI 测试?

ios - PSPDFKit SDK 崩溃

ios - iOS 中的构建对象文件扩展名是什么?

ios - 在 Swift 中使用 C 函数

iphone - 如何取消一系列 UITouch 事件?