Mon problème est que je cherchais un moyen d'utiliser à la fois le storyboard et xib . Mais je ne trouve pas le moyen approprié de charger et d'afficher le storyboard par programmation. Le projet a commencé à se développer avec xib, et maintenant il est très difficile d'imbriquer tous les fichiers xib dans le storyboard. Je cherchais donc un moyen de le faire dans le code, comme avec alloc, init, push
pour viewControllers. Dans mon cas, je n'ai qu'un seul contrôleur dans le storyboard:, UITableViewController
qui a des cellules statiques avec du contenu que je veux montrer. Si quelqu'un sait comment travailler à la fois avec xib et storyboard sans refactoring énorme, j'apprécierai toute aide.
la source
[sb instantiateInitialViewController]
est pratique si vous souhaitez démarrer sur le contrôleur de vue par défaut de la scène.[self presentViewcontroller]
logique par ces lignes dans l'ordre suivant: 1)self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
2)self.window.rootViewController = vc;
et 3)[self.window makeKeyAndVisible];
. Vous pouvez également probablement vous débarrasser de lamodalTransitionStyle
ligne, car il ne s'agit pas d'une transition modale du délégué d'application.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
Attribuez un ID de Storyboard à votre contrôleur de vue.
IB> Afficher l'inspecteur d'identité> Identité> ID du storyboard
Swift (héritage)
let storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = storyboard.instantiateViewControllerWithIdentifier("viewController") as? UIViewController self.navigationController!.pushViewController(vc!, animated: true)
Edit: Swift 2 suggéré dans un commentaire de Fred A.
si vous souhaitez utiliser sans navigationController, vous devez utiliser comme suit:
let Storyboard = UIStoryboard(name: "Main", bundle: nil) let vc = Storyboard.instantiateViewController(withIdentifier: "viewController") present(vc , animated: true , completion: nil)
la source
self.storyboard
et fusionner les lignes 1 et 2Dans l'inspecteur d'attributs, donnez l'identifiant de 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];
la source
Essaye ça
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"Login"]; [[UIApplication sharedApplication].keyWindow setRootViewController:vc];
la source
dans swift
NavigationController et pushController, vous pouvez remplacer
present(vc, animated:true , completion: nil)
la source
Pour swift 3 et 4 , vous pouvez le faire. La bonne pratique consiste à définir le nom de Storyboard égal à 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) } }
puis 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 énumération " StoryBoardName "
la source
Vous pouvez toujours accéder 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];
la source
L'extension ci-dessous vous permettra de charger un
Storyboard
et il est associéUIViewController
. Exemple: Si vous avez unUIViewController
nomméModalAlertViewController
et un storyboard nommé "ModalAlert", par exemplelet vc: ModalAlertViewController = UIViewController.loadStoryboard("ModalAlert")
Charge à la fois le
Storyboard
etUIViewController
etvc
sera de typeModalAlertViewController
. Remarque Suppose que l'ID du storyboard du storyboard a le même nom que le storyboard et que le storyboard a été marqué comme Is Initial View Controller .extension UIViewController { /// Loads a `UIViewController` of type `T` with storyboard. Assumes that the storyboards Storyboard ID has the same name as the storyboard and that the storyboard has been marked as Is Initial View Controller. /// - Parameter storyboardName: Name of the storyboard without .xib/nib suffix. static func loadStoryboard<T: UIViewController>(_ storyboardName: String) -> T? { let storyboard = UIStoryboard(name: storyboardName, bundle: nil) if let vc = storyboard.instantiateViewController(withIdentifier: storyboardName) as? T { vc.loadViewIfNeeded() // ensures vc.view is loaded before returning return vc } return nil } }
la source