Переключение ViewController с помощью кнопки не отображает панель навигации во втором ViewController - PullRequest
0 голосов
/ 15 мая 2018

Я хочу создать страницу, где вы нажимаете кнопку «Войти» (ведьма находится на панели навигации, левый элемент), а после показывает вторую страницу (также называемую домашней страницей), где пользователь может выйти.В то же время я хочу запомнить, что пользователь вошел в систему, используя UserDefault.

Вот мой файл AppDelegate:

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

var window: UIWindow?


func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    theViewController(controllerIs: LoginPage())

    return true
}
fileprivate func theViewController(controllerIs: UIViewController) {
    window = UIWindow(frame: UIScreen.main.bounds)
    window?.makeKeyAndVisible()
    window?.rootViewController = UINavigationController(rootViewController: controllerIs)
}

}

Представление входа в систему:

import UIKit

class LoginPage: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
    view.backgroundColor = .green
    navigationItem.leftBarButtonItem = UIBarButtonItem(title: "Login", style: .plain, target: self, action: #selector(handleLogin))
}
@objc private func handleLogin() {

    let root = UIApplication.shared.keyWindow?.rootViewController
    root?.present(SignOutPage(), animated: true, completion: {
        //some code here
    })


}
}

Представление «Выйти»:

import UIKit

class SignOutPage: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .yellow

    navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Sign Out", style: .plain, target: self, action: #selector(handleSignOut))

}
@objc private func handleSignOut() {
    let root = UIApplication.shared.keyWindow?.rootViewController
    root?.present(LoginPage(), animated: true, completion: {
        //some code here
    })

}
}

Результат: enter image description here и представление «Выйти» enter image description here вместо enter image description here

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

В иерархии навигации есть два шага вперед.

  1. Стек навигации следует только в случае pushViewController.В случае present модально вам нужно инициировать новый стек навигации

    let navVC = UINavigationController.init(rootViewController: viewController)
    self.present(navVC, animated: true, completion: nil)
    

Где, viewController - это объект вашего нового UIViewController.

Вместо использования UIApplication.shared.keyWindow?.rootViewController каждый раз, когда вы должны использовать стек навигации (для push) и просматривать контроллер (для настоящего момента) как:

// Push
self.navigationController?.pushViewController(viewController, animated: true)

// Present Modally
self.present(viewController, animated: true, completion: nil)

Где, self - это объект контроллера вида, а viewController - объект нового UIViewController.


Итак, ваш handleLogin() включенLoginPage будет выглядеть так:

// Push
@objc private func handleLogin() {
    guard let vc = UIStoryboard.init(name: "Main", bundle: .main).instantiateViewController(withIdentifier: "SignOutVC") as? SignOutPage else { return }
    self.navigationController?.pushViewController(vc, animated: true)
}

// Pop
@objc private func handleLogin() {
    guard let vc = UIStoryboard.init(name: "Main", bundle: .main).instantiateViewController(withIdentifier: "SignOutVC") as? SignOutPage else { return }
    let navVC = UINavigationController.init(rootViewController: vc)
    self.present(navVC, animated: true, completion: nil)
}

И, handleSignOut() на SignOutPage будет выглядеть так:

// Push
@objc private func handleSignOut() {
    self.navigationController?.popViewController(animated: true)
}

// Pop
@objc private func handleSignOut() {
    self.dismiss(animated: true, completion: nil)
}

ПРИМЕЧАНИЕ. Необходимо установить идентификатор раскадровки следующим образом:

enter image description here

0 голосов
/ 15 мая 2018

Когда вы делаете это:

let root = UIApplication.shared.keyWindow?.rootViewController
root?.present(SignOutPage(), animated: true, completion: {
    //some code here
})

вы представляете контроллер представления SignOutPage модально, который помещает его поверх корневого контроллера представления.

То, что вы хотите сделать, это нажатьэто в стек контроллера навигации, поэтому вам нужно что-то вроде этого:

navigationController?.pushViewController(SignOutPage(), animated: true)

Таким же образом, когда вы выходите из системы вместо представления контроллера представления, вы хотите вытолкнуть текущий из стека, выполняя что-то вроде этого:

navigationController?.popViewController(animated: true)

Это вернет приложение к предыдущему контроллеру представления (логин).

...