Как насчет определения ваших контроллеров как ленивых контроллеров?
Я имею в виду, если запуск приложения занимает некоторое время из-за инициализации девяти контроллеров представления, то это связано с тем, что контроллер фактически делает во время инициализации. Таким образом, вы можете заставить контроллер лениво инициализироваться в два этапа: один, когда вы добавляете все свои контроллеры в контроллер панели вкладок; во-вторых, когда вы выбираете конкретную вкладку, соответствующий контроллер инициализируется.
Я думаю, что это самый чистый подход.
В противном случае, я бы поставил на прямое использование UITabBar
для управления им в своем собственном классе контроллеров панели вкладок.
В качестве последнего варианта я бы попытался на лету изменить содержимое контроллера панели вкладок, вызывая setViewControllers:animated:
в соответствующее время в соответствии с некоторыми логическими схемами. Например, вы можете инициализировать контроллер панели вкладок только с 5 контроллерами представления в application:didFinishLaunchingWithOptions:
, а затем добавить остальные в более поздний момент ...
Но мое реальное предложение - сделать контроллеры компонентов ленивыми ...
РЕДАКТИРОВАТЬ: после прочтения вашего вопроса в комментарии ...
Если вы попытаетесь выполнить отложенную инициализацию ваших контроллеров, я имею в виду следующее:
вы инициализируете свои контроллеры (или UIKit будет при загрузке пера), вызывая [[... alloc] init ...]; это не меняется;
метод init
инициализирует контроллер до его состояния по умолчанию, такого как установка свойств и значений ivar, и не делает ничего более сложного;
до отображения представления контроллера, вы завершаете его инициализацию, вызывая определенный метод; это выполнит часть «довольно много делегирования», которую я считаю длительной частью инициализации.
Извините, если разговор о "отложенной инициализации" вызвал неоднозначность между логической инициализацией компонента и содержанием метода init
.
Что касается пункта 3, у вас есть несколько вариантов того, где завершить инициализацию.
Возможно, когда контроллер будет отображаться. В этом случае либо вы определяете -tabBarController:didSelectViewController:
в делегате контроллера панели вкладок, либо используете viewWillAppear
. Это даст вам самую ленивую инициализацию из всех, но, возможно, добавит некоторую задержку в тот момент, когда вы выберете вкладку до появления представления.
Еще лучше использовать viewDidLoad
, что даст вам немного ленивую инициализацию; инициализация всех ваших контроллеров может произойти в какой-то момент времени, который вы не контролируете (конечно, до отображения представления), поэтому это может немного задержать события, но это не произойдет в applicationDidFinishLoading
и будет более дружественным к пользовательскому интерфейсу, так как он будет контролироваться основным циклом. Определенно, первый вариант, чтобы попробовать. Также обратите внимание на описание viewDidLoad
в справочнике UIViewController .
Наконец заметка об отдельной теме. Имейте в виду, что не все безопасно использовать UIKit
из отдельного потока, поэтому будьте осторожны.