web-dev-qa-db-fra.com

Comment appeler un contrôleur de vue par programme?

J'ai consulté tous les tutoriels que je peux trouver sur celui-ci et je n'ai toujours pas de réponse. J'ai besoin d'appeler une autre vue du code. J'utilise UIStoryboards. J'ai changé la vue à plusieurs reprises en faisant glisser UIButtons tout en maintenant la touche Contrôle enfoncée, mais elle doit maintenant provenir du code. J'essaie d'appeler la page d'information à partir du menu principal si c'est la première fois que l'utilisateur ouvre l'application. Je n'arrive pas à trouver un moyen de changer les vues à partir du code, cependant. Toutes mes vues sont contrôlées par les mêmes fichiers ( ViewController2 ). La identifier de mon menu principal est ViewControllerMain , et la identifier de la page d’information est ViewControllerInfo . J'ai d'abord essayé ceci:

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

Ensuite, j'ai essayé de créer UIViewControllers différent pour chacun et de dire:

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

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

Utilisation de l'identifiant non déclaré ViewControllerMain.

Dans le second, il est écrit:

nom d'interface inattendu 'ViewController': identifiant attendu.

Que puis-je faire?

61
John Farkerson

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 contrôleur de vue):

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

D'une part, utilisez nil plutôt que null.


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 égal au nom de classe de votre contrôleur de vue ou à un ID de storyboard que vous pouvez affecter à l'inspecteur d'identité de votre storyboard.

126

Vous devez instancier le contrôleur de vue à partir du storyboard, puis l'afficher:

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

Cet exemple suppose que vous ayez un contrôleur de navigation pour pouvoir revenir à la vue précédente. Vous pouvez bien sûr aussi utiliser presentViewController: animated: complétion :. L'essentiel est que votre storyboard instancie votre contrôleur de vue cible à l'aide de l'ID du contrôleur de vue cible.

20
tigloo

Rapide

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)

Modifiez le nom du storyboard, le nom de la vue et son identifiant, le cas échéant.

18
Suragch

Vous pouvez appeler ViewController de cette façon, si vous le souhaitez avec NavigationController

enter image description here

1.In Current Screen: Charger nouvel écran

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

2.1 En vue chargée: ajouter ci-dessous dans le fichier .h

@interface VerifyExpViewController : UIViewController <UINavigationControllerDelegate>

2.2 En vue chargée: ajouter ci-dessous dans le fichier .m

  @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 cela vous sera utile :)

5
swiftBoy

Vous pouvez le faire de deux manières:

1, Créez un segment avec votre ViewController dans votre Storyboard, comme expliqué dans ma réponse: Comment effectuer un segment sans relation avec la saisie de l'utilisateur dans iOS 5?

2, donnez votre ViewController et votre identifiant et appelez-le en utilisant le code de ma réponse ici: Appelez la scène du storyboard par programmation (sans avoir besoin de séparation)?

3
Darren

la logique principale derrière cet is_,

NSString * storyboardIdentifier = @"SecondStoryBoard";

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

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

[self presentViewController:UIVC animated:YES completion:nil];
1
Vaibhav Shiledar
        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
suresh

Importez la classe de contrôleur de vue que vous souhaitez afficher et utilisez le code suivant

KartViewController *viewKart = [[KartViewController alloc]initWithNibName:@"KartViewController" bundle:nil];
[self presentViewController:viewKart animated:YES completion:nil];
0
vijeesh