Wie rufe ich einen View Controller programmgesteuert auf?

70

Ich habe mir alle Tutorials angesehen, die ich zu diesem Thema finden kann, und ich habe immer noch keine Antwort. Ich muss eine andere Ansicht aus dem Code aufrufen. Ich benutze UIStoryboards. Ich habe die Ansicht viele Male durch Ziehen mit gedrückter Ctrl-Taste geändert UIButtons, aber jetzt muss sie aus dem Code stammen. Ich versuche, die Infoseite über das Hauptmenü aufzurufen, wenn der Benutzer die App zum ersten Mal geöffnet hat. Ich kann jedoch anscheinend keinen Weg finden, die Ansichten des Codes zu ändern. Alle meine Ansichten werden von denselben Dateien gesteuert ( ViewController2 ). Das identifierHauptmenü ist ViewControllerMain und das identifierder Infoseite ist ViewControllerInfo . Zuerst habe ich das versucht:

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

Dann habe ich versucht, UIViewControllersfür jeden etwas anderes zu machen und zu sagen:

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

Beides hat nicht funktioniert. Zum ersten heißt es:

Verwendung des nicht deklarierten Bezeichners ViewControllerMain.

Im zweiten heißt es:

unerwarteter Schnittstellenname 'ViewController': erwartete Kennung.

Was kann ich tun?

Samuel Noyes
quelle
Wie erstellen Sie die Controller?
Avi Tsadok
Ich habe sie in der Datei MainStoryboard.storyboard erstellt
Samuel Noyes

Antworten:

136

So erstellen Sie einen Ansichtscontroller:

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

So rufen Sie einen View Controller auf (muss von einem anderen Viewcontroller aus aufgerufen werden):

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

Verwenden Sie zum einen nil anstelle von null.


Laden eines View Controllers aus dem 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 Ihres View Controllers entspricht entweder dem Klassennamen Ihres View Controllers oder einer Storyboard-ID, die Sie im Identitätsinspektor Ihres Storyboards zuweisen können.

190290000 Rubelmann
quelle
2
Hi @ 190290000 Rubelmann. Dies funktioniert, aber ich möchte eine bereits erstellte Ansicht aus der Storyboard-Datei anzeigen. Dies gibt mir nur eine leere Ansicht. Gibt es eine Möglichkeit, dies zu tun? Ich gebe mein Bestes. Ich muss definitiv viel lernen.
Samuel Noyes
@ JohnFarkerson: Kein Problem!
190290000 Ruble Man
Angenommen, der Zeilencode UIViewController * vc = [Storyboard instantiateViewControllerWithIdentifier: @ "IDENTIFIER_OF_YOUR_VIEWCONTROLLER"]; mehrmals ausführen, dann jedes Mal ein neues * vc-Objekt erstellen? Was ist mit einem früheren * VC-Objekt? Ist das ein Speicherverlust?
Avijit Nagare
@AvijitNagare Nee Mann, dank ARC (vorausgesetzt, Sie verwenden es) wird die Referenz automatisch freigegeben, sodass Sie sich darüber keine Sorgen machen müssen. Wenn Sie mehrere Variablen mit demselben Namen erstellen möchten, führt dies zu einem Compilerfehler, sodass Sie dies nicht einmal tun können.
Samuel Noyes
in Ordnung. bedeutet UIViewController * vc = [Storyboard instantiateViewControllerWithIdentifier: @ "IDENTIFIER_OF_YOUR‌ _VIEWCONTROLLER"]; erstellt jedes Mal eine neue Variable. ARC verwaltet jedoch seinen Speicher.
Avijit Nagare
20

Sie müssen den View Controller über das Storyboard instanziieren und dann anzeigen:

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

In diesem Beispiel wird davon ausgegangen, dass Sie über einen Navigationscontroller verfügen, um zur vorherigen Ansicht zurückzukehren. Sie können natürlich auch presentViewController verwenden: animiert: Vervollständigung:. Der Hauptpunkt besteht darin, dass Ihr Storyboard Ihren Zielansichts-Controller mithilfe der ID des Zielansichts-Controllers instanziiert.

Tigloo
quelle
20

Schnell

Dadurch wird ein View Controller aus dem Storyboard abgerufen und präsentiert.

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

Ändern Sie den Storyboard-Namen, den View-Controller-Namen und die View-Controller-ID entsprechend.

Suragch
quelle
Was ist, wenn ich keinen View Controller im Storeyboard habe, aber alles ist, dass ich eine programmatische Klasse erstelle? Wie kann ich einen View Controller programmatisch erstellen und ihm eine Klasse zuweisen und ihn präsentieren
iOS Developer
@ iOSDeveloper, ich weiß es nicht.
Suragch
5

Sie können ViewController auf diese Weise aufrufen, wenn Sie mit NavigationController möchten

Geben Sie hier die Bildbeschreibung ein

1. Im aktuellen Bildschirm: Neuen Bildschirm laden

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

2.1 In der geladenen Ansicht: Fügen Sie unten in der .h-Datei hinzu

@interface VerifyExpViewController : UIViewController <UINavigationControllerDelegate>

2.2 In der geladenen Ansicht: Fügen Sie unten in der .m-Datei hinzu

  @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

Hoffe das wird nützlich für jemanden dort :)

swiftBoy
quelle
1

Hauptlogik dahinter ist_,

NSString * storyboardIdentifier = @"SecondStoryBoard";

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

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

[self presentViewController:UIVC animated:YES completion:nil];
Vaibhav Shiledar
quelle
Was ist, wenn ich keinen View Controller im Storeyboard habe, aber alles ist, dass ich eine programmatische Klasse erstelle? Wie kann ich einen View Controller programmatisch erstellen und ihm eine Klasse zuweisen und ihn präsentieren
iOS Developer
1
        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];
suresh
quelle
3
Die Frage ist 3 Jahre alt und hat eine akzeptierte Antwort. Wenn Sie einen wertvollen Beitrag haben, erklären Sie ihn bitte und geben Sie nicht nur den Postleitzahl ein.
pancho018
0

Importieren Sie die View Controller-Klasse, die Sie anzeigen möchten, und verwenden Sie den folgenden Code

KartViewController *viewKart = [[KartViewController alloc]initWithNibName:@"KartViewController" bundle:nil];
[self presentViewController:viewKart animated:YES completion:nil];
vijeesh
quelle
Was ist, wenn ich keinen View Controller im Storeyboard habe, aber alles ist, dass ich eine programmatische Klasse erstelle? Wie kann ich einen View Controller programmatisch erstellen und ihm eine Klasse zuweisen und ihn präsentieren
iOS Developer
Der obige Code benötigt kein Storyboard. Er funktioniert mit xibs.
Vijeesh
Was ist, wenn ich weder Storyboards noch Xibs habe?
iOS Developer
Initialisieren Sie es ohne
Federnamen