web-dev-qa-db-fra.com

UIStoryboard: Quelle est la bonne façon d'obtenir le Storyboard actif?

Je suis actuellement en train de fouiller furieusement tous les documents et je n'ai pas tout à fait trouvé ce que je cherchais. Je soupçonne que c'est un vrai d'oh! répondre.

J'ai simplement besoin de trouver le storyboard actif dans le bundle principal et je veux savoir la meilleure façon de le faire.

C'est pour que je puisse utiliser le [UIStoryboard storyboardWithName:@"XXX" bundle:mainBundle] pour extraire le storyboard en cours d'exécution.

Je sais comment le calmer en allumant l'idiome, mais je pense que c'est un ... kludge.

Quelle est la bonne façon de procéder?

MISE À JOUR:

D'ACCORD. Je l'ai trouvé.

Comme d'habitude, sur Stack Overflow (le site officiel Apple Documentation Site;).

Voici le code sur lequel j'ai choisi:

UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];
50
Chris Marshall

D'ACCORD. Comme mon commentaire ci-dessus l'indique, j'ai trouvé la réponse à la (question mal formulée):

Je voulais pouvoir obtenir le storyboard principal (pas actif), car je n'utilise pas plusieurs storyboards par incarnation. J'utilise le modèle standard de 1 storyboard pour iPhone et 1 pour iPad. Je voulais juste le moyen le plus propre pour obtenir le storyboard, afin de pouvoir l'utiliser pour générer un contrôleur de vue.

J'ai trouvé la réponse dans ce post sur Stack Overflow , et l'ai implémentée avec le code suivant:

UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];
26
Chris Marshall

Dans le cas où vous souhaitez obtenir le storyboard actif pour un viewController, il existe une propriété de storyboard. Voici comment je l'ai résolu, au lieu de créer une nouvelle instance:

LoginViewController *vc = [navController.storyboard instantiateViewControllerWithIdentifier:@"firstLaunch"];
[navController presentModalViewController:vc animated:YES];

Dans Swift vous appelleriez:

let loginViewController = navigationController?.storyboard?.instantiateViewController(withIdentifier: "firstLaunch") as! LoginViewController
navigationController?.present(loginViewController, animated: true, completion: nil)

Vous pouvez également être beaucoup plus sûr en utilisant des gardes contre le contrôleur de navigation et le storyboard. J'ai utilisé as! afin de garantir que vous obtenez un LoginController.

39
olivaresF

Dans Swift, vous utiliseriez la syntaxe suivante:

let storyboard = UIStoryboard(name: "Main", bundle: nil) 

Notez qu'en passant nil à bundle, l'appel fera automatiquement référence à votre bundle principal .

Si vous êtes dans un contrôleur de vue que vous avez sur le Storyboard et que vous souhaitez instancier directement le Storyboard à partir de là, vous pouvez simplement faire:

let storyboard: UIStoryboard? = self.storyboard // call this inside a VC that is on the Storyboard

Notez que dans le dernier cas, self.storyboard renverra un optionnel Storyboard (Storyboard?), donc si vous souhaitez l'utiliser, déballez-le comme ceci:

if let storyboard = self.storyboard {
  // access storyboard here
}
6
nburk

Je viens de copier le formulaire de code ci-dessus mis à jour la question afin que tout le monde puisse le voir comme une réponse.

UIStoryboard *st = [UIStoryboard storyboardWithName:[[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"] bundle:[NSBundle mainBundle]];
1
Imran Khan