Je voudrais définir le viewcontroller initial à partir de l'appdelegate. J'ai trouvé une très bonne réponse, mais c'est dans l'Objectif C et j'ai du mal à réaliser la même chose rapidement.
Définir par programme le contrôleur de vue initial à l'aide de Storyboards
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:UIScreen.mainScreen.bounds];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *viewController = // determine the initial view controller here and instantiate it with [storyboard instantiateViewControllerWithIdentifier:<storyboard id>];
self.window.rootViewController = viewController;
[self.window makeKeyAndVisible];
return YES;
}
Quelqu'un peut-il aider?
Je veux que le Viewcontroller initial dépende de certaines conditions remplies à l'aide d'une instruction conditionnelle.
Réponses:
J'ai utilisé ce fil pour m'aider à convertir l'objectif C en rapide, et cela fonctionne parfaitement.
Instancier et présenter un viewController dans Swift
Code Swift 2 :
Code Swift 3 :
la source
UIWindow
et de définir son contrôleur de vue racine par programme.Essaye ça. Par exemple: vous devez utiliser
UINavigationController
comme contrôleur de vue initial. Ensuite, vous pouvez définir n'importe quel contrôleur de vue en tant que racine à partir du storyboard.Voir mon écran de storyboard.
la source
Pour Swift 3, Swift 4:
Instanciez le contrôleur de vue racine à partir du storyboard:
Si vous souhaitez utiliser en
UINavigationController
tant que root:Instanciez le contrôleur de vue racine à partir de xib:
C'est presque la même chose, mais au lieu de lignes
tu devras écrire
la source
si vous n'utilisez pas de storyboard, vous pouvez essayer ceci
la source
Pour les nouveaux Xcode 11.xxx et Swift 5.xx, où la cible est définie sur iOS 13+.
Pour la nouvelle structure de projet, AppDelegate n'a rien à faire concernant rootViewController.
Une nouvelle classe est là pour gérer la classe window (UIWindowScene) -> fichier 'SceneDelegate'.
la source
Voici une bonne façon de l'aborder. Cet exemple place un contrôleur de navigation en tant que contrôleur de vue racine et place le contrôleur de vue de votre choix au bas de la pile de navigation, prêt à être poussé à partir de celui-ci.
Pour que cet exemple fonctionne, vous définiriez "MainViewController" comme ID de Storyboard sur votre contrôleur de vue principal, et le nom de fichier du storyboard dans ce cas serait "MainStoryboard.storyboard". Je renomme mes storyboards de cette façon parce que Main.storyboard pour moi n'est pas un nom propre, en particulier si jamais vous allez le sous-classer.
la source
je l'avais fait sur objectif-c j'espère que ce sera utile pour vous
la source
Code pour code Swift 4.2 et 5:
Et pour
Xcode 11+
and for Swift 5+
:la source
var window: UIWindow?
.And for Xcode 11+ and for Swift 5+
une partie m'aide beaucoup. merci l'hommeJe l'avais fait dans Xcode 8 et Swift 3.0, j'espère que cela vous sera utile et que cela fonctionne parfaitement. Utilisez le code suivant:
Et si vous utilisez le contrôleur de navigation, utilisez le code suivant pour cela:
la source
Swift 4:
Ajoutez ces lignes dans AppDelegate.swift, dans la fonction didFinishLaunchingWithOptions () ...
Maintenant, par exemple, nous faisons souvent quelque chose comme ça lorsque nous voulons soit conduire l'utilisateur à un écran de connexion ou à un écran de configuration initiale, soit revenir à l'écran principal de l'application, etc. Si vous voulez faire quelque chose comme ça aussi , vous pouvez utiliser ce point comme un embranchement pour cela.
Pensez-y. Vous pourriez avoir une valeur stockée dans NSUserDefaults par exemple qui contenait un booléen userLoggedIn et
if userLoggedIn == false { use this storyboard & initialViewController... } else { use this storyboard & initialViewController... }
la source
Eh bien, toutes les réponses ci-dessus / ci-dessous produisent un avertissement concernant l'absence de point d'entrée dans le storyboard.
Si vous voulez avoir 2 (ou plus) contrôleurs de vue d'entrée qui dépendent d'une condition (par exemple, conditionVariable ), alors ce que vous devez faire est:
Utilisez le code suivant:
J'espère que cela t'aides.
la source
Si vous n'utilisez pas le storyboard. Vous pouvez initialiser votre contrôleur de vue principale par programme.
Swift 4
Et également supprimer
Main
des informations de déploiement .la source
Voici la solution complète dans Swift 4 implémentez ceci dans didFinishLaunchingWithOptions
écrivez cette fonction n'importe où dans Appdelegate.swift
la source
Juste au cas où vous voudriez le faire dans le contrôleur de vue et non dans le délégué d'application: récupérez simplement la référence à l'AppDelegate dans votre contrôleur de vue et réinitialisez son objet de fenêtre avec le contrôleur de vue droit car c'est rootviewController.
la source
Pour Swift 4.0 .
Dans votre fichier AppDelegate.swift dans la méthode didfinishedlaunchingWithOptions , placez le code suivant.
J'espère que cela fonctionnera très bien.
la source
Swift 5 et Xcode 11
Ainsi, dans xCode 11, la solution de fenêtre n'est plus valide à l'intérieur de appDelegate. Ils l'ont déplacé vers SceneDelgate. Vous pouvez le trouver dans le fichier SceneDelgate.swift.
Vous remarquerez qu'il a maintenant un
var window: UIWindow?
cadeau.Dans ma situation, j'utilisais un TabBarController à partir d'un storyboard et je voulais le définir comme rootViewController.
Voici mon code:
sceneDelegate.swift
Assurez-vous d'ajouter ceci à la méthode de scène correcte comme je l'ai fait ici. Notez que vous devrez définir le nom d'identifiant du tabBarController ou du viewController que vous utilisez dans le storyboard.
Dans mon cas, je faisais cela pour définir un stateController pour garder une trace des variables partagées parmi les vues d'onglets. Si vous souhaitez faire la même chose, ajoutez le code suivant ...
StateController.swift
Remarque: utilisez simplement vos propres variables ou tout ce que vous essayez de suivre à la place, je viens de lister les miennes comme exemple dans tdfvariables struct.
Dans chaque vue de TabController, ajoutez la variable membre suivante.
Ensuite, dans ces mêmes fichiers, ajoutez ce qui suit:
Cela vous permet d'éviter l'approche singleton pour passer des variables entre les vues. Cela permet facilement le modèle d'injection de dépendances qui est bien meilleur à long terme que l'approche singleton.
la source
Désactiver
Main.storyboard
Ajouter un identifiant de storyboard
Swift 5 et Xcode 11
Étendre
UIWindow
Edit généré par Xcode
SceneDelegate.swift
la source
la source
la source
Ouvrez un viewcontroller avec SWRevealViewController From App délégué.
la source
Pour Swift 5+
la source