Приложение UINavigationControllerДелегируйте UIViewController программно

Я пытаюсь программно создать UINavigationController и два UIVewControllers и иметь возможность переходить от первого VC ко второму VC и обратно с помощью навигационного контроллера. Я пробовал разные методы, чтобы заставить это работать. Я оставил некоторые строки в исходном коде закомментированными, чтобы дать подсказки о том, что я пробовал.

С текущим методом я получаю это предупреждение (оно не работает):

Предупреждение: Попытка представить ‹x.VC2: 0x7fd27240df00> на ‹x.VC1: 0x7fd27240db60>, представление которого не находится в иерархии окон!

В AppDelegate.swift:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    let navcon = UINavigationController()
    //navcon.viewControllers = [VC1(), VC2()]    // tried this without success
    navcon.viewControllers = [VC1()]

    window = UIWindow()
    window?.makeKeyAndVisible()
    //window?.rootViewController = VC1()         // one variation that I tried

    window?.rootViewController = navcon.viewControllers[0]
    return true
}

В VC1.swift:

var navcon: UINavigationController!
let vc2 = VC2()

//---------------------------------------------

override func viewDidLoad() {
    super.viewDidLoad()
    navcon = self.navigationController
    //navcon?.viewControllers.append(vc2)
    let x = navcon?.viewControllers
    let n = x?.count
}

//---------------------------------------------

func triggeredFunction()  {
    self.present(vc2, animated: true, completion: nil)
    //navcon.pushViewController(vc2, animated: true)
}

person user292344    schedule 02.03.2018    source источник


Ответы (1)


Результат: введите здесь описание изображения

Код:

AppDelegate:

    window = UIWindow()
    let firstVC = FirstViewController()
    let navigationController = UINavigationController(rootViewController: firstVC)
    window?.rootViewController = navigationController
    window?.makeKeyAndVisible()

Первый ВК:

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .green

    let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
    button.backgroundColor = .red
    view.addSubview(button)
    button.addTarget(self, action: #selector(showSecondVC), for: .touchUpInside)
}

@objc func showSecondVC() {
    let secondVC = SecondViewController()
    navigationController?.pushViewController(secondVC, animated: true)
}

Второй ВК:

view.backgroundColor = .yellow

Надеюсь, поможет! Пожалуйста, дайте мне знать, если это работает для вас или нет.

person Tung Fam    schedule 02.03.2018
comment
Да, это работает. Большое тебе спасибо. Но не лучше ли создать экземпляр SecondViewController только один раз в viewDidLoad()? - person user292344; 03.03.2018
comment
Да, безусловно. Вы также можете сделать его ленивым var, чтобы он создавался только тогда, когда пользователь нажимает на него, я думаю. - person Tung Fam; 03.03.2018