Замените UIAlertController другим UIAlertController.

У меня есть Parse Sign Up, и у меня есть 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) {
                // ...
            }

        })

Но приложение зависает на контроллере ожидающих оповещений (тот, что с индикатором). который уже представлен (нулевой)

Любые идеи? Спасибо.


person kareem    schedule 22.04.2015    source источник
comment
В части «еще» вы не отклонили ожидающий контроллер.   -  person Sohil R. Memon    schedule 22.04.2015


Ответы (2)


В документации Apple указано, что вы не должны изменять иерархию представлений для UIAlertController. Это может вызвать проблемы позже и может быть частью вашей текущей проблемы.

Также вероятно, что причиной вашей проблемы является демонстрация одного из них во время работы другого. Закрытие первого и после завершения представления второго должно теоретически решить вашу проблему. Тот факт, что он зависает, говорит о том, что происходит что-то еще. Вы должны остановить и удалить индикатор активности из представления, прежде чем закрыть его.

Я думаю, что лучшим подходом было бы рассмотреть возможность использования HUD, такого как https://github.com/jdg/MBProgressHUD для отображения прогресса или активности вместо того, чтобы пытаться использовать контроллер предупреждений не по назначению.

HUD отлично подходит для представления прогресса или активности в режиме хедз-ап, ожидая, что что-то произойдет. Он имеет ряд параметров отображения, включая активность с текстом заголовка. Я бы представил HUD, когда вы ждете, а затем использовал контроллер предупреждений для представления предупреждений.

Я обнаружил, что использование HUD выглядит лучше и им намного легче управлять.

person Rory McKinnel    schedule 22.04.2015

Попробуйте отклонить ожидающее оповещение и представить следующее оповещение без анимации.

pending.dismissViewControllerAnimated(false, completion: nil)
self.presentViewController(alertController, animated: false, completion: nil)
person pteofil    schedule 22.04.2015
comment
В итоге я просто поместил все остальные условия в блок завершения, и это сработало, я также попробую ваше решение. - person kareem; 22.04.2015
comment
Очень некрасиво, но эффективно - person Santiago; 07.10.2015