Загрузите ViewController в ContainerView перед отображением, чтобы переход не был видимым - PullRequest
0 голосов
/ 31 декабря 2018

Использование Swift 4+, iOS 11.4+, Xcode 10 +

Я использую ContainerView с контроллером навигации для загрузки нескольких ViewController.

Кроме того, ViewController, который содержитContainerView также помещается в другой стек NavigationController.

См. Рисунок:

enter image description here

«Меню» - это корневой контроллер встек.Я помещаю другой ViewController (TopViewController) в тот же стек - пока все хорошо.

Моя проблема заключается в том, что я хочу "предварительно загрузить" TopViewController> ContainerView с другим ViewController (Item1) до становится видимым TopViewController.

В дополнение к Item1 есть другие ViewController, которые мне нужно будет "предварительно загрузить" таким образом.

У меня естьпопытался использовать «viewDidLoad» в TopViewController для нажатия Item1,

toVC = storyboard?.instantiateViewController(withIdentifier: "Item1") as! Item1
TopNav.pushViewController(toVC, animated: true)

, и это работает - но только после того, как TopViewController станет видимым.Это означает, что вы можете видеть Item1 «всплывающим» в виде, а не уже видимым.

Я также пробовал этот код из VC меню, но он ничего не выдвигает в ContainerView.

let toVC = self.storyboard?.instantiateViewController(withIdentifier: "TopViewController") as! TopViewController

// Tried this to 'pre-load' the next VC - shows no VC, and disables 'back' navigation
let toNav = toVC.navigationController
let nextVC = storyboard?.instantiateViewController(withIdentifier: "Item1") as! Item1
// Neither of the lines below loads the Item1 VC....
//toNav?.viewControllers = [nextVC]
toNav.pushViewController(toVC, animated: true)

Как я могу вставить Item1 в стек навигации для ContainerView до того, как VC с ContainerView станет видимым?

FYI: Вы можете скачать мой пример проекта здесь: https://gitlab.com/whoit/newviews

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Я думаю, что вам нужен способ управления дочерними контроллерами представления, верно?(childVC1 = item1, childVC2 = item2 и т. д.)

Если это так, это может помочь .

Другой маршрут мог бы встроить ваш TopViewController в TabBarController и скрыть панель вкладок.Затем, когда элемент выбран, вы загружаете TopViewController с индексом вкладки, связанным с элементом.

Редактировать:

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

  1. Избавьтесь от своей базы UINavigationController и получите MenuViewController в качестве начального ViewController.
  2. Добавьте сегменты к каждому элементу, которые соответствуют одному и тому же UINavigationController.
  3. В MenuViewController переопределите prepare(for:, sender:) и инициализируйте UIViewController, связанный с выбранным элементом.Вы можете сделать это, назвав segues и включив имена, или сопоставив отправителя с кнопкой.

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        switch segue.identifier {
    
        case "item1Segue":
            guard let item1VC = storyboard?.instantiateViewController(withIdentifier: "Item1") else { return assertionFailure() }
            item1VC.title = "Item1"
            (segue.destination as UINavigationController)?.setViewControllers([item1VC], animated: false)
    
        case "item2Segue":
            guard let item2VC = storyboard?.instantiateViewController(withIdentifier: "Item2") else { return assertionFailure() }
            item2VC.title = "Item2" UINavigationController)?.setViewControllers([item2VC], animated: false)
            // And so on
        }
    }
    

    Чтобы получить тот же пользовательский интерфейс, который был у вас с TopViewController, добавьте обратно и такжеНа панели кнопок элемента Item viewControllers заголовок следует, задав заголовок, как показано в коде.

0 голосов
/ 31 декабря 2018
   TopNav.pushViewController(toVC, animated: true)

и это работает - но только после того, как TopViewController станет видимым.

Поскольку вы запросили анимацию.Измените animated: true на animated: false Если это то, что вы хотите.


Предыдущее верно, но с вашим проектом было много других проблем.

Самое важное, ваше представление контейнера не имеет ограничений .Это приводит к неправильному размеру.Дайте ему ограничения в раскадровке.

Во-вторых, сделайте то, что я сказал выше: нажмите toVC с false анимацией.

В-третьих, вам нужно предварительно загрузить вид контроллера вашего вида сверху, какэто:

@IBAction func Item1_Tap(_ sender: UIButton) {
    let toVC = self.storyboard?.instantiateViewController(
        withIdentifier: "TopViewController") as! TopViewController
    toVC.loadViewIfNeeded() // add this line
    // then delete all the other useless stuff

Результат:

enter image description here

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