Comment appeler un contrôleur de vue par programmation?

j'ai regardé tous les tutos que je peux trouver sur celui-ci, et je n'ai toujours pas la réponse. J'ai besoin d'une autre vue du code. J'utilise UIStoryboards . J'ai changé la vue de nombreuses fois en faisant glisser le contrôle de UIButtons , mais maintenant il doit être à partir du code. Je suis en train d'appeler la page d'info dans le menu principal si c'est la première fois que l'utilisateur a ouvert l'application. Toutefois, Je ne vois pas comment modifier les points de vue exprimés dans le code. Tous mes points de vue sont contrôlés par les mêmes fichiers ( ViewController2 ). Le identifier de mon menu principal est ViewControllerMain , et le identifier de la page d'information est ViewControllerInfo . J'ai d'abord essayé ceci:

[ViewControllerMain presentViewController: ViewControllerInfo 
                                 animated:YES 
                               completion: NULL];

puis j'ai essayé de faire différent UIViewControllers pour chacun et en disant:

[ViewController2 presentViewController: ViewController 
                              animated:YES 
                            completion: NULL];

Non travaillé. Pour le premier, il est écrit:

Utilisation d'un identificateur non déclaré ViewControllerMain.

dans le second, il est dit:

nom inattendu de l'interface "ViewController": identifiant attendu.

Que puis-je faire?

60
demandé sur Alex Cio 2013-04-21 21:55:11

8 réponses

pour créer un contrôleur de vue:

UIViewController * vc = [[UIViewController alloc] init];

pour appeler un contrôleur de vue (doit être appelé depuis un autre Controller de vue):

[self presentViewController:vc animated:YES completion:nil];

pour un, utilisez zéro plutôt que nul.


Chargement d'un contrôleur de vue à partir du storyboard:

NSString * storyboardName = @"MainStoryboard"; 
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"IDENTIFIER_OF_YOUR_VIEWCONTROLLER"];
[self presentViewController:vc animated:YES completion:nil];

Identifier de votre contrôleur de vue est soit égal au nom de classe de votre contrôleur de vue, soit un Storyboard ID que vous pouvez assigner dans l'inspecteur d'identité de votre storyboard.

125
répondu 190290000 Ruble Man 2014-06-10 04:49:09

vous devez instancier le contrôleur de vue à partir du storyboard et ensuite le montrer:

ViewControllerInfo* infoController = [self.storyboard instantiateViewControllerWithIdentifier:@"ViewControllerInfo"];
[self.navigationController pushViewController:infoController animated:YES];

Cet exemple suppose que vous avez une manette de navigation pour revenir à la vue précédente. Vous pouvez bien sûr aussi utiliser presentViewController: animated: completion:. Le point principal est que votre storyboard instancie votre contrôleur de vue cible en utilisant L'ID du contrôleur de vue cible.

20
répondu tigloo 2013-04-21 21:00:32

Swift

cela obtient un contrôleur de vue du storyboard et le présente.

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let secondViewController = storyboard.instantiateViewController(withIdentifier: "secondViewControllerId") as! SecondViewController
self.present(secondViewController, animated: true, completion: nil)

Changer le storyboard nom, nom de-vue-contrôleur, et l'affichage de l'id du contrôleur approprié.

16
répondu Suragch 2017-12-16 04:53:51

vous pouvez appeler ViewController de cette façon, si vous voulez avec NavigationController

enter image description here

1.Dans L'écran courant : charger le nouvel écran

VerifyExpViewController *addProjectViewController = [[VerifyExpViewController alloc] init];
[self.navigationController pushViewController:addProjectViewController animated:YES];

2.1 Chargé de Vue : ajouter ci-dessous .h fichier

@interface VerifyExpViewController : UIViewController <UINavigationControllerDelegate>

2.2 en vue chargé : Ajouter ci-dessous en .m fichier

  @implementation VerifyExpViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.navigationController.delegate = self;
    [self setNavigationBar];
}
-(void)setNavigationBar
{
    self.navigationController.navigationBar.backgroundColor = [UIColor clearColor];
    self.navigationController.navigationBar.translucent = YES;
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"B_topbar.png"] forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.titleTextAttributes = @{NSForegroundColorAttributeName: [UIColor whiteColor]};
    self.navigationItem.hidesBackButton = YES;
    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Btn_topback.png"] style:UIBarButtonItemStylePlain target:self action:@selector(onBackButtonTap:)];
    self.navigationItem.leftBarButtonItem.tintColor = [UIColor lightGrayColor];
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Save.png"] style:UIBarButtonItemStylePlain target:self action:@selector(onSaveButtonTap:)];
    self.navigationItem.rightBarButtonItem.tintColor = [UIColor lightGrayColor];
}

-(void)onBackButtonTap:(id)sender
{
    [self.navigationController popViewControllerAnimated:YES];
}
-(IBAction)onSaveButtonTap:(id)sender
{
    //todo for save button
}

@end

j'Espère que ce sera utile pour quelqu'un :)

5
répondu swiftBoy 2015-03-21 12:18:41

il y a 2 façons de le faire:

1, Créer une suite à votre ViewController dans votre Storyboard comme expliqué dans ma réponse ici: comment effectuer une séquence qui n'est pas liée à l'entrée de l'utilisateur dans iOS 5?

2, Donnez votre ViewController et votre identifiant et appelez-le en utilisant le code dans ma réponse ici: appeler scène storyboard programmatically (sans avoir besoin de suivre)?

3
répondu Darren 2017-05-23 12:26:10

logique principale derrière cette is_,

NSString * storyboardIdentifier = @"SecondStoryBoard";

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardIdentifier bundle: nil];

UIViewController * UIVC = [storyboard instantiateViewControllerWithIdentifier:@"YourviewControllerIdentifer"];

[self presentViewController:UIVC animated:YES completion:nil];
1
répondu Vaibhav Shiledar 2016-08-30 11:06:56

importer la classe de contrôleur de vue que vous voulez afficher et utiliser le code suivant

KartViewController *viewKart = [[KartViewController alloc]initWithNibName:@"KartViewController" bundle:nil];
[self presentViewController:viewKart animated:YES completion:nil];
0
répondu vijeesh 2015-08-24 07:40:11
        UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone_iOS7" bundle:nil];
            AccountViewController * controller = [storyboard instantiateViewControllerWithIdentifier:@"accountView"];
            //            [self presentViewController:controller animated:YES completion:nil];

        UIViewController *topRootViewController = [UIApplication sharedApplication].keyWindow.rootViewController;
        while (topRootViewController.presentedViewController)
        {
            topRootViewController = topRootViewController.presentedViewController;
        }

        [topRootViewController presentViewController:controller animated:YES completion:nil];
0
répondu suresh 2017-01-28 19:10:57