2017-02-12 28 views
2

У меня проблема, когда я перехожу из viewController A в viewController B, в котором он имеет примерно 5 секундную задержку перед переходом на него. Я считаю, что это связано с количеством просмотров, которые я загружаю в viewDidLoad.Как создать экземпляр и загрузить контроллер представления перед тем, как перейти к нему с помощью swift

У меня есть xib-файл, который имеет представление стека из 11 разделов, представляющих уровни. В каждом разделе есть кнопка и несколько изображений, которые могут меняться в зависимости от прогресса пользователей.

Кроме того, я создаю 10 из этих представлений xib для загрузки в scrollview. Все это происходит в viewDidLoad.


Я интересно, если я могу загрузить ViewController B и он все готово к работе, прежде чем на самом деле, нажав на кнопку, которая SEGUE-х к нему; надеюсь, исправление задержки, которую я получаю. Я также использую пользовательские segues для контроллеров и из них.

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

ОБНОВЛЕНИЕ: ответ отвечает на часть моего вопроса относительно того, как подготовить контроллер представления для эффективности, он не отвечает за задержку, но я думаю, что я понял, прочитал ли вы комментарии ниже ответить ...

+0

Я не думаю, что задержка вызвана так много views.Or вы предоставляете некоторый код здесь, как вы создаете VC2. – aircraft

+0

Не думайте, что вы можете «предварительно загрузить» контроллер вида, так как жизненный цикл - это низкоуровневая особенность segues. Но, если вы считаете, что количество загружаемых представлений (будь то 10 файлов xib или остальное), вы можете загрузить их в VC A и отправить их в VC B в режиме подготовки к segues. – dfd

ответ

2

вы можете переместить весь тяжелый код из viewDidLoad() в какой-то пользовательский метод

func prepare() { 
// Something hard 
} 

, чем вы можете подготовить контроллер в любое время и сохранить его

var heavyController: HeavyViewController? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    heavyController = HeavyViewController() 
    heavyController?.prepare() 
} 

, а не просто использовать heavyController в segue вместо создания нового. Надеюсь это поможет.

P.S. рассмотрите возможность перемещения тяжелых частей кода в фоновый поток, вы можете проверить example.

UPDATE: Чтобы показать подготовленный контроллер с помощью SEGUE сделать что-то вроде этого:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "HeavyController" { 
     present(heavyController, animated: true, completion: nil) 
    } 
} 
+0

Это кажется довольно прямолинейным. Так как я использую пользовательский segue, хотя, и у меня есть его настройка в Interface Builder, есть ли способ изменить контроллер назначения на эту подготовленную версию? – Discoveringmypath

+0

Проверьте обновленный ответ. –

+0

Итак, я добавил готовку (для segue), и она работает до тех пор, пока идет segue, но затем я получаю нулевое значение при развертывании необязательного значения для просмотров. Я попытался добавить loadView() в подготовленную версию, но ничего не сделал. Мне придется продолжать смотреть на это позже, но спасибо, я чувствую, что нахожусь на правильном пути. – Discoveringmypath

 Смежные вопросы

  • Нет связанных вопросов^_^