J'ai une scène de storyboard modal que je veux être accessible à toutes mes autres scènes. La création d'un enchaînement modal à partir de chaque scène de mon storyboard crée un gros désordre de cordes allant partout. Existe-t-il un moyen de laisser de côté les séquences et d'appeler la scène par programme à la place?
Fondamentalement, je veux faire quelque chose comme ça:
MyNewViewController *myNewVC = [[MyNewViewController alloc] init];
[self presentModalViewController:myNewVC animated:YES];
sauf qu'au lieu de créer et de pousser une classe de contrôleur de vue, je veux faire une transition modale vers une scène de storyboard "isolée" (non liée à une séquence).
Oui, vous pouvez. Faites quelque chose comme ça pour avoir accès au VC, puis juste Modal Poussez-le:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone" bundle:nil];
MyNewViewController *myVC = (MyNewViewController *)[storyboard instantiateViewControllerWithIdentifier:@"myViewCont"];
Remarque: la méthode presentModalViewController: animated est déconseillée dans iOS 6.
Le nouveau code devrait se lire:
NSString * storyboardName = @"MainStoryboard_iPhone";
NSString * viewControllerID = @"ViewID";
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
MyViewController * controller = (MyViewController *)[storyboard instantiateViewControllerWithIdentifier:viewControllerID];
[self presentViewController:controller animated:YES completion:nil];
Dans le storyboard, donnez à votre contrôleur de vue un identifiant (sous l'inspecteur d'attributs), puis utilisez le code suivant pour faire avancer cette vue.
UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"STORYBOARDNAME" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"VIEWCONTROLLERIDENTIFIER"];
[self presentModalViewController:vc animated:YES];
J'ai un cas où je veux présenter un contrôleur de vue de la partie principale de l'application, un avec les paramètres et l'aide, etc. Pour ce faire, je veux que ce soit dans un contrôleur de navigation, une sorte de petit module enfichable que nous pouvons appeler à partir d'un UIBarButtonItem.
Maintenant, cela peut être vers/dans le storyboard actuel, ou vers un autre, cela n'a pas d'importance.
Je veux le faire de cette façon, car je déteste le potentiel des spaghettis de ligne de segue partout dans mon storyboard.
Voici comment procéder.
- (IBAction)displaySettings:(id)sender
{
LOG_SELECTOR() // google that for extra goodness
// FYI, this can be done using a different storyboard like so.
/*
NSString * storyboardName = @"MainStoryboard_iPhone"; // possibly use device idiom?
UIStoryboard * storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
*/
// To Push a new set of scenes with a new Navigation Controller, it is done like this:
UINavigationController *settingsNC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings Nav Controller"];
OBSettingsUIViewController *settingsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"Settings root"];
[settingsNC pushViewController:settingsVC animated:NO];
[settingsNC setModalTransitionStyle:UIModalTransitionStyleCrossDissolve];
// Present the view controller;
[self presentViewController:settingsNC animated:YES completion:NULL];
}
Dans les contrôleurs de vue présentés (ou dans une sous-classe du contrôleur de navigation), vous pouvez avoir un UIBarButtonItem pour ensuite ignorer toute la hiérarchie présentée des contrôleurs de vue comme suit:
- (IBAction)dismissThisVC:(id)sender {
[self dismissViewControllerAnimated:YES completion:nil];
}
J'espère que cela aide un tas de gens à sortir. À votre santé.
Appelez pour naviguer vers une autre classe
UIWindow *window = [[[UIApplication sharedApplication] windows] objectAtIndex:0];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UINavigationController *navController = (UINavigationController *)window.rootViewController;
DumpFeed *dump = [storyboard instantiateViewControllerWithIdentifier:@"DumpFeed"];
dump.isPushed=YES;
dump.strUserId = appDelegate.strFriendid;
[navController pushViewController:dump animated:YES];
Appelez simplement viewcontroller à l'aide du contrôleur de navigation Écrivez ce code dans viewcontroller et définissez viewcontroller dans storyboad comme défini dans l'image.
ProfileVC *vc = [[UIStoryboard storyboardWithName:@"Main" bundle:nil] instantiateViewControllerWithIdentifier:@"ProfileVC"];
[self.navigationController pushViewController:vc animated:YES];
Je pense qu'avec iOS7, il est devenu très facile à mettre en œuvre via le storyboard
J'apprends actuellement les nouvelles fonctionnalités d'iOS7 et j'ai trouvé cette solution simple, mais elle aurait pu être pertinente même dans les versions précédentes, je ne suis pas sûr.
Vous devez d'abord connecter le présent VC avec la cible VC (c'est la seule connexion nécessaire), puis dans l'inspecteur des attributs du storyboard, choisissez le style à modal). , dans l'inspecteur d'identité, donnez à votre VC un storyboardID et assurez-vous que vous avez coché la case "utiliser storyboardID",
Si ce n'est pas encore là, ajoutez cette méthode à votre présentation VC:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
YourTargetVC * targetVC =
(YourTargetVC *)segue.destinationViewController;
if(nil != targetVC) {
//Do preparations here
}
}
Maintenant, lorsque vous souhaitez montrer votre VC cible à partir de votre VC de présentation, vous pouvez utiliser:
[self performSegueWithIdentifier:(NSString *) sender:(id)];
où l'identifiant est le storyboardID de votre viewController et l'expéditeur est la vue qui a déclenché l'action, cette méthode invoquera la scène des storyboards, donc le [prepareForSegue: sender:]
sera appelée pour permettre à u de faire les dernières modifications avant que le TargetViewController n'apparaisse.
Heres Swift 3 version:
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let viewController = storyboard.instantiateViewController(withIdentifier: "baseViewController")
self.present(viewController, animated: true, completion: nil)