Как мне программно установить InitialViewController
раскадровку? Я хочу открыть свою раскадровку в другом представлении в зависимости от некоторых условий, которые могут варьироваться от запуска к запуску.
252
Как мне программно установить InitialViewController
раскадровку? Я хочу открыть свою раскадровку в другом представлении в зависимости от некоторых условий, которые могут варьироваться от запуска к запуску.
Ответы:
Как без фиктивного начального вида контроллера
Убедитесь, что все начальные контроллеры представления имеют Storyboard ID.
В раскадровке снимите флажок «Исходный контроллер вида» из первого контроллера представления.
Если вы запустите свое приложение на этом этапе, вы увидите:
И вы заметите, что ваше свойство окна в делегате приложения теперь равно nil.
В настройках приложения перейдите к своей цели и
Info
вкладке. Там ясно, стоимостьMain storyboard file base name
. НаGeneral
вкладке очистите значение дляMain Interface
. Это удалит предупреждение.Создайте окно и желаемый начальный контроллер представления в
application:didFinishLaunchingWithOptions:
методе делегата приложения :источник
didFinishLaunchingWithOptions
вызывается, когда приложение запускается в новом процессе. Если вы перейдете на домашний экран и вернетесь в приложение, этот метод больше не будет вызываться. (Если iOS не завершает работу из-за ограничений памяти.) Попробуйте остановить приложение и снова запустить его из среды IDE. Если проблема не исчезнет, сообщите об этом в SO, и я с радостью помогу вам, друг.self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
Для всех любителей Swift ответ @Travis переведен на SWIFT :
Сделайте то, что @Travis объяснил перед кодом Objective C. Затем,
Это
ExampleViewController
будет новый начальный контроллер вида, который вы хотели бы показать.Шаги объяснили:
Наслаждайтесь и счастливого программирования!
источник
Вы можете программно установить rootViewController ключевого окна в
(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
например:
источник
init()
/deinit()
цикл, но без выполненияviewDidLoad()
или правильной инициализацииIBOutlet
-s. Убедитесь, что ваш код готов к этому.Swift 3: обновление до кода @ victor-sigler
источник
Вы можете установить Navigation rootviewcontroller в качестве контроллера основного вида. Эту идею можно использовать для автоматического входа в систему согласно требованию приложения.
Для пользователей StoryboardSegue
Спасибо
источник
Откройте mainstoryboard, сначала выберите представление, которое вы хотите запустить, затем откройте Utilities -> Attributes. Под «View Controller» вы видите радиокнопку «Is initial View Controller». Просто выберите это.
--- к пересмотренному вопросу:
Может быть, вы можете попробовать это: напишите метод в разделе ViewDidLoad вашего начального представления, и когда метод запускается при запуске приложения, метод вызывает переход к другому представлению.
источник
SWIFT 5
Если у вас не установлен ViewController в качестве начального ViewController в раскадровке, вам нужно сделать 2 вещи:
Наконец, теперь вы можете добавить свой код в SceneDelegate:
источник
Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set
предупреждение, которое я получал после того, как решил создать свой первоначальный VC в коде. Важным моментом, когда @ rs7 говорит «удалить поле имени раскадровки», они означают весь ряд списка, а не только содержимое самого поля.Я не думаю, что это возможно. Вместо этого вы можете иметь один начальный контроллер, который будет иметь переходы к различным контроллерам представления. При запуске вы можете решить, какой переход выполнять программно.
источник
Вы можете установить
initial view controller
с помощью Interface Builder, а также программно.Ниже описан подход, используемый для программного обеспечения.
Цель-C:
Свифт:
источник
Я создал класс маршрутизации для обработки динамической навигации и поддержания чистоты класса AppDelegate, надеюсь, он поможет и другим.
И в вашем AppDelegate вызовите это
источник
Вот еще одно решение с использованием Swift 3 и Swift 4, позволяющее избежать наложения силы.
И ниже используется с
UINavigationController
источник
В
AppDelegate.swift
вы можете добавить следующий код:Конечно, вам нужно реализовать свою логику, исходя из того, по каким критериям вы выберете подходящий контроллер представления.
Кроме того, не забудьте добавить удостоверение (выберите раскадровку -> Сцена контроллера -> Показать инспектор удостоверений -> назначить StorboardID).
источник
ОБНОВЛЕННЫЙ ОТВЕТ для iOS 13 и делегата сцены:
Убедитесь, что в вашем файле info.plist вы попали в Манифест сцены приложения -> Конфигурация сцены -> Роль сеанса приложения -> Элемент 0 и также удалите ссылку на главную раскадровку. В противном случае вы получите то же предупреждение о невозможности создания экземпляра из раскадровки.
Кроме того, переместите код из делегата приложения в сцену метода делегата сцены (_: willConnectTo: options :), так как именно здесь обрабатываются события жизненного цикла.
источник
Несколько дней назад я столкнулся с такой же ситуацией. Очень простой трюк решил эту проблему. Я установил скрытый мой начальный вид контроллера до запуска2. Если начальный контроллер представления является правильным контроллером, это установлено в видимый в viewDidLoad. Иначе, переход выполняется к желаемому контроллеру представления. Он отлично работает в iOS 6.1 и выше. Я уверен, что это работает на более ранних версиях iOS.
источник
Спасибо изменил это в AppDelegate следующим образом:
источник
Нашел простое решение - не нужно удалять «первоначальную проверку контроллера вида» из раскадровки и редактировать вкладку «Информация о проекте» и использовать
makeKeyAndVisible
, просто поместитев
источник
rootVC
отinstantiateViewControllerWithIdentifier
, правильно?Другим способом является представление viewController,
Сначала вам нужно создать объект вашей раскадровки, затем изменить корень (если требуется), затем вы берете ссылку на конкретный контроллер представления, который выдвигает текущий контроллер представления (если вы меняете root), иначе это просто новый контроллер представления, который может
источник
Swift 4, Xcode 9
в файле AppDelegate.swift
источник
источник
Swift 5 или выше # сделать контроллер вида маршрута с помощью этого простого кода. Если вы используете xcode 11 или выше, сначала инициализируйте
var window: UIWindow?
в AppDelegateисточник
Если вы предпочитаете не изменять applicationDidFinish, вы можете сделать следующий трюк:
Установите контроллер навигации в качестве начального контроллера представления и назначьте ему пользовательский класс «MyNavigationController». Затем вы можете настроить его корневой контроллер представления во время viewDidLoad - он переопределит корневой контроллер представления, который вы установили в раскадровке.
источник
Выберите контроллер представления, который вы хотите открыть первым, и перейдите к инспектору атрибутов. Перейти к начальной сцене и проверить, является ли начальная опция просмотра контроллера.
Теперь это будет ваш начальный контроллер представления, который откроется первым при запуске приложения.
источник