Не удалось закрыть 2 просмотра контроллера - PullRequest
0 голосов
/ 13 октября 2018

У меня есть 3 ViewController: LoginViewController, CheckinViewController и ProfileViewController

Поток: LoginVC -> CheckinVC -> ProfileVC

Что мне нужно: я хочу отклонить "ProfileVC"&" CheckinVC ", когда нажмите кнопку выхода из системы в" ProfileVC ", затем вернитесь к" LoginVC "

LoginVC.swift

let checkinViewController = self.storyboard?.instantiateViewController(withIdentifier: "CheckinViewController") as! CheckinViewController                    
self.navigationController?.pushViewController(checkinViewController, animated: true)
JustHUD.shared.hide()
self.dismiss(animated: false, completion: nil)

CheckinVC.swift

if let profileView = self.storyboard?.instantiateViewController(withIdentifier: "ProfileViewController") {
        profileView.providesPresentationContextTransitionStyle = true
        profileView.definesPresentationContext = true
        profileView.modalPresentationStyle = UIModalPresentationStyle.overCurrentContext;
        //            profileView.view.backgroundColor = UIColor.init(white: 0.4, alpha: 0.8)
        profileView.view.backgroundColor = UIColor.clear
        profileView.view.isOpaque = false
        self.present(profileView, animated: true, completion: nil)

Вот я пытаюсь сделать

ProfileVC.swift

@IBAction func clickLogout(_ sender: Any) {
    UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
    UserDefaults.standard.synchronize()

    self.dismiss(animated: false, completion: {
        print("ProfileView : dismiss completed")

        let loginViewController = self.storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
        self.navigationController?.pushViewController(loginViewController, animated: true)

        self.dismiss(animated: false, completion: {
            print("SUCCESS")
        })

    })
}

ProblemDismiss

Ответы [ 4 ]

0 голосов
/ 13 октября 2018

Проблема в том, что вы пытаетесь дважды закрыть ProfileVC, но на самом деле вам нужно закрыть его, а затем запустить CheckinVC.

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

Измените ProfileVC следующим образом:

@IBAction func clickLogout(_ sender: Any) {
    UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
    UserDefaults.standard.synchronize()

    let navigationController = self.navigationController
    let loginViewController = storyboard?.instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
    self.dismiss(animated: false, completion: {
        print("ProfileView : dismiss completed")
        navigationController?.pushViewController(loginViewController, animated: true)
        navigationController?.popViewController(animated: false)
    })
}
0 голосов
/ 13 октября 2018

Хотя решение Enea Dume является правильным, если вы хотите использовать раскадровки, вот объяснение проблемы и решение, если вы хотите сделать это в коде, как вы это делали до сих пор.

Проблема

Если мы сосредоточимся на вызовах self.dismiss в функции logoutFunction в ProfileVC, это то, что происходит.

При первом вызове self.dismiss ProfileVC отклонити будет удален из стека представлений.

В делегате завершения вы отправляете новый LoginVC в контроллер навигации.Однако CheckIN VC представлен поверх контроллера навигации, поэтому вы не можете видеть, что что-то происходит.

Второй вызов self.dismiss ничего не делает, так как ProfileVC не представляет никаких других контроллеров представления и не находится встек больше.

Решение

Вам необходимо сохранить ссылку на LoginVC, который представил CheckInVC.Если вы вызовете «reference to LoginVC» .dismiss, он отклонит контроллеры представления над ним в стеке и вернет вас обратно к контроллеру представления входа в систему.

0 голосов
/ 13 октября 2018

В классе CheckinVC.swift, в функции viewDidAppear, проверьте, активен ли пользователь или нет на основе сеанса, который вы поддерживаете, и всплывающее окно для входа в контроллер представления соответственно.Если статус пользователя вышел из системы, то он перейдет к контроллеру входа в систему.Иначе это будет работать как обычно.

0 голосов
/ 13 октября 2018

Ну, вам нужно сделать Unwind Segue, чтобы вы могли вернуться к своему LoginVC.Выполните эти четыре простых шага, чтобы создать Unwind segues:

  1. В контроллере представления, к которому вы пытаетесь вернуться, LoginVC в своем примере, напишите этот код:

    @IBAction func unwindToVC1(segue:UIStoryboardSegue) { }
    

(Помните: важно вставить этот метод в контроллер представления, к которому вы пытаетесь вернуться!)

  1. ВStoryboard, перейдите на экран, с которого вы пытаетесь отмотаться (в нашем случае ProfileVC), и удерживайте нажатой клавишу + 1020 *, перетащив его на значок «Выход», расположенный сверху.

exit 3. Перейдите к схеме документа выбранного viewController в Storyboard, выберите the unwind segue, как показано ниже.

storyboard

Теперь перейдите к Attributes Inspector в Utilities Pane и назовите идентификатор последовательности раскрутки.

identity inspector

Наконец, напишите этот код там, где вы хотите, чтобы было запущено действие по раскрутке, ProfileVC в нашем случае.

 @IBAction func clickLogout(_ sender: Any) {
        UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!)
          UserDefaults.standard.synchronize()
            performSegue(withIdentifier: "unwindSegueToVC1", sender: self)
 }

Для получения дополнительной информации проверьте Создать раскрутить сегы

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