web-dev-qa-db-fra.com

Comment puis-je charger le storyboard par programme à partir de la classe?

Mon problème est que je cherchais un moyen d'utiliser à la fois storyboard et xib. Mais je ne trouve pas le moyen approprié de charger et de montrer le storyboard par programmation. Le projet a été lancé avec xib et il est maintenant très difficile d'imbriquer tous les fichiers xib dans le storyboard. Je cherchais donc un moyen de le faire en code, comme avec alloc, init, Push pour viewControllers. Dans mon cas, je n'ai qu'un seul contrôleur dans le storyboard: UITableViewController, qui contient des cellules statiques avec du contenu que je souhaite afficher. Si quelqu'un connaît la bonne façon de travailler à la fois avec xib et storyboard sans refactoring énorme, j'apprécierai toute aide.

170
kokoko

Dans votre scénario, accédez à l'inspecteur Attributs et définissez l'identificateur du contrôleur de vue. Vous pouvez ensuite présenter ce contrôleur de vue à l'aide du code suivant.

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];
353
James Beith

Swift 3

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController(withIdentifier: "viewController")
self.navigationController!.pushViewController(vc, animated: true)

Swift 2

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController")
self.navigationController!.pushViewController(vc, animated: true)

Prérequis

Assignez un ID Storyboard à votre contrôleur de vue.

Storyboard ID

IB> Afficher l'inspecteur d'identité> Identité> ID de scénarimage

Swift (legs)

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController
self.navigationController!.pushViewController(vc!, animated: true)

Éditer: Swift 2 suggéré dans un commentaire par Fred A.

si vous voulez utiliser sans navigationController, vous devez utiliser les éléments suivants:

    let Storyboard  = UIStoryboard(name: "Main", bundle: nil)
    let vc = Storyboard.instantiateViewController(withIdentifier: "viewController")
    present(vc , animated: true , completion: nil)
64
SwiftArchitect

Dans attribut attribut, donnez l'identifiant pour ce contrôleur de vue et le code ci-dessous fonctionne pour moi

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
DetailViewController *detailViewController = [storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"];
[self.navigationController pushViewController:detailViewController animated:YES];
16
chaithraVeeresh

Essaye ça

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"];

[[UIApplication sharedApplication].keyWindow setRootViewController:vc];
4

à Swift
NavigationController et pushController vous pouvez remplacer pour

present(vc, animated:true , completion: nil)
2
Tarik

Pour Swift 3 et 4, vous pouvez le faire. La bonne pratique consiste à donner à Storyboard le nom correspondant à StoryboardID.

enum StoryBoardName{
   case second = "SecondViewController"
}
extension UIStoryBoard{
   class func load(_ storyboard: StoryBoardName) -> UIViewController{
      return UIStoryboard(name: storyboard.rawValue, bundle: nil).instantiateViewController(withIdentifier: storyboard.rawValue)
   }
}

et ensuite vous pouvez charger votre Storyboard dans votre ViewController comme ceci:

class MyViewController: UIViewController{
     override func viewDidLoad() {
        super.viewDidLoad()
        guard let vc = UIStoryboard.load(.second) as? SecondViewController else {return}
        self.present(vc, animated: true, completion: nil)
     }

}

Lorsque vous créez un nouveau storyboard, définissez simplement le même nom sur StoryboardID et ajoutez le nom du storyboard dans votre enum "StoryBoardName"

1
gandhi Mena

Vous pouvez toujours aller directement au contrôleur racine:

UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [storyboard instantiateInitialViewController];
vc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self presentViewController:vc animated:YES completion:NULL];
0
user938797