Comment définir par programme le InitialViewController
pour un Storyboard? Je veux ouvrir mon storyboard à une vue différente en fonction de certaines conditions qui peuvent varier d'un lancement à l'autre.
252
Comment définir par programme le InitialViewController
pour un Storyboard? Je veux ouvrir mon storyboard à une vue différente en fonction de certaines conditions qui peuvent varier d'un lancement à l'autre.
Réponses:
Comment sans contrôleur de vue initial factice
Assurez-vous que tous les contrôleurs de vue initiaux ont un ID de storyboard.
Dans le storyboard, décochez l'attribut "Is initial View Controller" du premier contrôleur de vue.
Si vous exécutez votre application à ce stade, vous lirez:
Et vous remarquerez que votre propriété de fenêtre dans le délégué d'application est désormais nulle.
Dans le paramètre de l'application, accédez à votre cible et à l'
Info
onglet. Là, la valeur deMain storyboard file base name
. Sous l'General
onglet, effacez la valeur deMain Interface
. Cela supprimera l'avertissement.Créez la fenêtre et le contrôleur de vue initial souhaité dans la
application:didFinishLaunchingWithOptions:
méthode du délégué d'application :la source
didFinishLaunchingWithOptions
est appelé lorsque l'application est lancée dans un nouveau processus. Si vous accédez à l'écran d'accueil et revenez à l'application, cette méthode ne sera plus invoquée. (À moins que iOS ne s'arrête en raison de contraintes de mémoire.) Essayez d'arrêter l'application et de la relancer à partir de votre IDE. Si le problème persiste, postez le problème à SO et je serai heureux de vous aider, ami.self.window = UIWindow(frame: UIScreen.mainScreen().bounds) var storyboard = UIStoryboard(name: "Main", bundle: nil) var viewController: UIViewController = // self.window!.rootViewController = viewController self.window!.makeKeyAndVisible()
Pour tous les amoureux de Swift , voici la réponse de @Travis traduite en SWIFT :
Faites ce que @Travis a expliqué avant le code Objective C. Ensuite,
le
ExampleViewController
serait le nouveau contrôleur de vue initial que vous souhaitez afficher.Les étapes expliquées:
Profitez-en et bonne programmation!
la source
Vous pouvez définir par programme rootViewController de la fenêtre clé dans
(BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
par exemple:
la source
init()
/deinit()
, mais sans exécuterviewDidLoad()
ou initialiser correctementIBOutlet
-s. Assurez-vous que votre code est prêt pour cela.Swift 3: mise à jour du code de @ victor-sigler
la source
Vous pouvez définir Navigation rootviewcontroller comme contrôleur de vue principal. Cette idée peut être utilisée pour la connexion automatique selon les exigences de l'application.
Pour les utilisateurs de StoryboardSegue
Merci
la source
Ouvrez le tableau principal, sélectionnez d'abord la vue que vous souhaitez démarrer, puis ouvrez Utilitaires -> Attributs. Sous le "View Controller", vous voyez le bouton radio "Is initial View Controller". Sélectionnez-le.
--- À la question révisée:
Peut-être pouvez-vous essayer ceci: écrivez une méthode dans la section ViewDidLoad de votre vue initiale et lorsque la méthode s'exécute au lancement de l'application, la méthode déclenche une transition vers une autre vue.
la source
SWIFT 5
Si vous n'avez pas de ViewController défini comme ViewController initial dans le storyboard, vous devez faire 2 choses:
Enfin, vous pouvez maintenant ajouter votre code dans SceneDelegate:
la source
Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set
avertissement que j'avais après avoir décidé d'instancier mon VC initial dans le code. Un point important, lorsque @ rs7 dit "supprimer le champ du nom du storyboard", cela signifie toute la ligne du plist, pas seulement le contenu du champ lui-même.Je ne pense pas que ce soit possible. Au lieu de cela, vous pouvez avoir un contrôleur initial qui aura des séquences vers différents contrôleurs de vue. Au démarrage, vous pouvez décider quelle séquence effectuer par programme.
la source
Vous pouvez définir à l'
initial view controller
aide d'Interface Builder ainsi que par programme.Ci-dessous, l'approche utilisée pour la programmation.
Objectif c :
Rapide :
la source
J'ai créé une classe de routage pour gérer la navigation dynamique et garder la classe AppDelegate propre, j'espère que cela aidera d'autres aussi.
Et dans votre AppDelegate, appelez cela
la source
Une autre solution avec l'utilisation de Swift 3 et Swift 4 pour éviter le lancer forcé est comme ceci
Et ci-dessous utilise avec
UINavigationController
la source
Dans,
AppDelegate.swift
vous pouvez ajouter le code suivant:Bien sûr, vous devez implémenter votre logique, en fonction des critères que vous choisirez un contrôleur de vue approprié.
N'oubliez pas non plus d'ajouter une identité (sélectionnez storyboard -> Controller Scene -> Afficher l'inspecteur d'identité -> assigner StorboardID).
la source
RÉPONSE MISE À JOUR pour iOS 13 et délégué de scène:
assurez-vous que dans votre fichier info.plist, allez dans Manifeste de scène d'application -> Configuration de scène -> Rôle de session d'application -> Élément 0 et supprimez également la référence au storyboard principal. Sinon, vous obtiendrez le même avertissement concernant l'échec de l'instanciation du storyboard.
Déplacez également le code du délégué d'application vers la scène de la méthode de délégué de scène (_: willConnectTo: options :), car c'est là que les événements du cycle de vie sont désormais traités.
la source
Il y a quelques jours, j'ai rencontré la même situation. Une astuce très simple a résolu ce problème. J'ai mis mon contrôleur de vue initial caché avant le lancement2. Si le contrôleur de vue initial est le bon contrôleur, il est défini sur visible dans viewDidLoad. Sinon, une séquence est effectuée vers le contrôleur de vue souhaité. Cela fonctionne parfaitement dans iOS 6.1 et supérieur. Je suis sûr que cela fonctionne sur les versions antérieures d'iOS.
la source
Merci d'avoir modifié cela comme suit dans AppDelegate:
la source
Solution simple trouvée - pas besoin de supprimer la "vérification initiale du contrôleur de vue" du storyboard et de modifier l'onglet Info du projet et de l'utiliser
makeKeyAndVisible
, il suffit de placerdans
la source
rootVC
deinstantiateViewControllerWithIdentifier
, correct?Une autre façon est de présenter viewController,
Vous devez d'abord créer un objet de votre storyboard, puis changer de racine (si nécessaire), puis vous prendrez la référence d'un contrôleur de vue particulier qui est poussé le contrôleur de vue actuel (si vous changez de racine) sinon c'est juste un nouveau contrôleur de vue qui peut vous
la source
Swift 4, Xcode 9
dans le fichier AppDelegate.swift
la source
la source
Swift 5 ou supérieur # rend le contrôleur de vue d'itinéraire par ce code simple. Si vous utilisez xcode 11 ou supérieur, initialisez d'abord
var window: UIWindow?
dans AppDelegatela source
Si vous préférez ne pas modifier applicationDidFinish, vous pouvez effectuer l'astuce suivante:
Définissez le contrôleur de navigation comme contrôleur de vue initial et affectez-lui une classe personnalisée «MyNavigationController». Ensuite, vous pouvez modifier son contrôleur de vue racine pendant viewDidLoad - il remplacera le contrôleur de vue racine que vous avez défini dans votre storyboard.
la source
Sélectionnez le contrôleur de vue que vous souhaitez ouvrir en premier et accédez à l'inspecteur d'attributs. Allez à la scène initiale et cochez l'option du contrôleur de vue initiale.
Maintenant, ce sera votre contrôleur de vue initial qui s'ouvrira en premier lors du lancement de l'application.
la source