iOS Невозможно закрыть диспетчер вида - PullRequest
0 голосов
/ 07 января 2020

У меня проблема с моим приложением. Сценарий прост, после успешного создания учетной записи я не хочу закрывать текущую страницу или переходить на страницу входа. Моя раскадровка выглядит следующим образом:

enter image description here

После успешного создания аккаунта у меня появляется всплывающее окно с некоторой информацией о том, что все в порядке, мы отправляем вам письмо с подтверждением и после этого всплывающее окно я хочу go на второй странице слева - это моя главная страница приложения (теперь называется "View Controller").

Я попытался закрыть окно, но у меня нет эффекта, оно может только отклонить мое всплывающее окно. Когда я пытаюсь перенаправить, у меня возникает проблема с кнопкой «Назад» при нажатии, это приводит к странице регистрации. Есть некоторый код:

// Create new user and send verification email

        Auth.auth().createUser(withEmail: userEmail, password: userPassword) { user, error in if error == nil && user != nil {
            self.sendVerificationMail();
            self.displayAlertMessage(alertTitle: "Success", alertMessage: "Your account created successfully. We send you a verification email.");

            // Redirect to View Controller

            } else {
            self.displayAlertMessage(alertTitle: "Unhandled error", alertMessage: "Undefined error #SignUpViewController_0002");
            }
        }

...

func displayAlertMessage(alertTitle: String, alertMessage:String, alertRedirection:String = ""){
        let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: UIAlertController.Style.alert);

        let okAction = UIAlertAction(title:"Ok", style: UIAlertAction.Style.default, handler: nil);

        alert.addAction(okAction);

        self.present(alert, animated:true, completion:nil);
    }

Если я добавлю это:

self.view.window! .RootViewController? .Dismiss (animated: false, завершение: nil)

После оповещения, он закрывает только оповещение, до оповещения ничего не делает (так же, как отклонить).

Ответы [ 3 ]

1 голос
/ 07 января 2020

Чтобы закрыть и перейти к главному виду, вы можете использовать обработчик действий кнопки оповещения.

alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: { (action) in

            self.dismiss(animated: true, completion: {
                self.navigationController?.popToRootViewController(animated: true)
            })
        }))

Или вы можете использовать навигацию для указания c вида контроллера, используя строки ниже.

for viewController in self.navigationController!.viewControllers {
            if viewController.isKind(of: <Your_Main_ViewController_Class_Name>.self) {
                self.navigationController?.popToViewController(viewController, animated: true)
                break
            }
        }

Your_Main_ViewController_Class_Name - это контроллер представления, который находится в вашем стеке контроллера навигации, к которому вам нужно перейти. (ie) главный вид

Чтобы вслепую перейти к главному виду после отображения всплывающего окна с предупреждением, вы можете использовать обработчик завершения, пока присутствует предупреждение.

self.present(alert, animated: true, completion: {
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.01) {
                self.navigationController?.popToRootViewController(animated: true)
            }
        })
0 голосов
/ 07 января 2020

Просмотр класса контроллера:

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func viewDidAppear(_ animated: Bool) {
        self.performSegue(withIdentifier: "notLoggedView", sender: self);
    }
}

Идентификатор класса установлен на «тест»:

enter image description here

«Нажатие»:

...
let storyboard = UIStoryboard(name: "Main", bundle: nil)
            let vc = storyboard.instantiateViewController(withIdentifier: "test") as ViewController
            navigationController?.pushViewController(vc, animated: true)
...

И, к сожалению, ошибка:

'UIViewController' не конвертируется в 'ViewController'

Где я допустил ошибку?

0 голосов
/ 07 января 2020

хорошо, вы используете контроллер навигации, чтобы «представить» новый контроллер представления, вам нужно, например, его sh.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("IDOFYOURVIEW") as CLASS_NAME_OFYOUR_VIEWCONTROLLER
navigationController?.pushViewController(vc, animated: true)

с последним кодом, который вы можете «представить "(pu sh) новый контроллер вида

Теперь, если вы хотите выполнить другое действие, когда нажимаете кнопку, попробуйте следующие строки

override func viewDidLoad {
    super.viewDidLoad()
    self.navigationItem.hidesBackButton = true
    let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Bordered, target: self, action: "back:")
    self.navigationItem.leftBarButtonItem = newBackButton
}

func back(sender: UIBarButtonItem) {
    //in this part you can move to other view controller, examples
    // Go back specific view in your navigation controller
    for controller in self.navigationController!.viewControllers as Array {
    if controller.isKind(of: NAMECLASS_OFYOUR_VIEWCONTROLLER.self) {
        _ =  self.navigationController!.popToViewController(controller, animated: true)
        break
       }
    }
    // Perform your custom actions
    // ...
    // Go back to the previous ViewController
    self.navigationController?.popViewControllerAnimated(true)
}

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...