用另一个 UIAlertController 替换 UIAlertController

Replace UIAlertController with another UIAlertController

我有一个 Parse 注册,我有一个 UIAlertController,我希望 UIAlertController 显示一个指示器,但在注册出现错误时被另一个 UIAlertController 解雇。

我有几个注册失败的案例,所有这些都在添加带有指示器的 UIAlertController 之前工作。当注册成功并且正确关闭时,指示器警报控制器工作正常。

//create an alert controller
    let pending = UIAlertController(title: "Creating New User", message: nil, preferredStyle: .Alert)

    //create an activity indicator
    let indicator = UIActivityIndicatorView(frame: pending.view.bounds)
    indicator.autoresizingMask = .FlexibleWidth | .FlexibleHeight
    //add the activity indicator as a subview of the alert controller's view
    pending.view.addSubview(indicator)
    indicator.userInteractionEnabled = false // required otherwise if there buttons in the UIAlertController you will not be able to press them
    indicator.startAnimating()
    self.presentViewController(pending, animated: true, completion: nil)

这是注册代码,有效

        if signUpError == nil {
            println("Sign Up Successful")
            // Keep track of the installs of our app
            var installation: PFInstallation =  PFInstallation.currentInstallation()
            installation.addUniqueObject("Reload", forKey: "channels")
            installation["user"] = PFUser.currentUser()
            installation.saveInBackground()


            // to stop the uialertviewcontroller once sign up successful
            pending.dismissViewControllerAnimated(true, completion: {
                self.performSegueWithIdentifier("goToAppFromSignUp", sender: self)

            })

         }

这就是我卡住的地方,这只是其中一种情况,如果我能让它工作,我可以为其他人做。

        else {
            println("Error Sign Up")


            //If email has been used for another account kPFErrorUserEmailTaken
            if(signUpError!.code == 203) {

                let alertController = UIAlertController(title: "Sign Up Failed", message: "Sorry! Email has been taken! ", preferredStyle: .Alert)


                let OKAction = UIAlertAction(title: "OK", style: .Default) { (action) in
                    // ...
                }
                alertController.addAction(OKAction)



                    self.presentViewController(alertController, animated: true) {
                        // ...
                    }  
            }

我的想法是关闭 UIAlertController 并在完成块中显示下一个

pending.dismissViewControllerAnimated(true, completion: {
self.presentViewController(alertController, animated: true) {
                // ...
            }

        })

但是应用程序在挂起的警报控制器(带有指示器的那个)上冻结。 已经在呈现 (null)

有什么想法吗?谢谢。

尝试关闭挂起的警报并在没有动画的情况下显示下一个警报。

pending.dismissViewControllerAnimated(false, completion: nil)
self.presentViewController(alertController, animated: false, completion: nil)

在 Apple 文档中,它指出您不应修改 UIAlertController 的视图层次结构。这可能会在以后给您带来问题,并且可能是您当前问题的一部分。

也有可能是出现一个而另一个 运行 导致了您的问题。解雇第一个,一旦完成呈现第二个,理论上应该可以解决您的问题。它挂起的事实表明正在发生其他事情。在关闭它之前,您应该停止并从视图中删除 activity 指示器。

我认为更好的方法是考虑使用 https://github.com/jdg/MBProgressHUD 之类的 HUD 来显示进度或 activity 而不是尝试将警报控制器用于非预期用途。

HUD 非常适合在等待事情发生时显示单挑进度或 activity。它有许多显示选项,包括带有标题文本的 activity。我会在您等待时显示 HUD,然后使用警报控制器显示警报。

我发现使用 HUD 看起来更好,也更容易控制。