Domanda

Qualcuno può darmi il codice di esempio che posso usare per presentare prima una vista di controllo modale, poi respingerlo? Questo è quello che ho cercato:

    NSLog(@"%@", blue.modalViewController);
    [blue presentModalViewController:red animated:YES];
    NSLog(@"%@", blue.modalViewController);
    [blue dismissModalViewControllerAnimated:YES];
    NSLog(@"%@", blue.modalViewController);
Questo codice è in viewDidLoad ( "blu" e "rosso" sono entrambe sottoclassi di UIViewController). Mi aspetto che io ti indicherò la vista rossa e poi subito a nasconderlo, con un po 'di animazione. Tuttavia questo pezzo di codice presenta solo la vista modale e non respingerlo. Qualche idea? Il primo registro mostra "null", mentre gli altri due log mostrano
Un altro punto è, se ho messo questo codice in applicationDidFinishLaunching: la vista rossa non appare a tutti, e tutti i registri ottenere "null"

È stato utile?

Soluzione

Prima di tutto, quando si mette che il codice in applicationDidFinishLaunching, potrebbe essere il caso che i controllori istanziati da Interface Builder non sono ancora collegati alla vostra applicazione (in modo da "rosso" e "blu" sono ancora nil).

Ma per rispondere alla tua domanda iniziale, quello che stai facendo male è che si sta chiamando dismissModalViewControllerAnimated: sul controller sbagliato! Dovrebbe essere così:

[blue presentModalViewController:red animated:YES];
[red dismissModalViewControllerAnimated:YES];

Di solito il controller "rosso" dovrebbe decidere di licenziare se stesso ad un certo punto (forse quando un pulsante "Annulla" si fa clic). Poi il controllore "rosso" potrebbe chiamare il metodo su self:

[self dismissModalViewControllerAnimated:YES];

Se ancora non funziona, che potrebbe avere qualcosa a che fare con il fatto che il controller è presentato in modo di animazione, in modo da non potrebbe essere consentito di respingere il controllore in modo poco dopo lo ha presentato.

Altri suggerimenti

Il modo più semplice mi stanco in Xcode 4.52 è stato quello di creare una vista aggiuntivo e collegarli utilizzando modale segue (controllo trascinare il pulsante alla vista una al secondo punto di vista, ha scelto modale). Quindi trascinare in un pulsante a seconda vista o la vista modale che si è creato. Controllo e trascinare questo pulsante per il file di intestazione e utilizzare il collegamento azione. Questo creerà un IBAction nel file controller.m. Trova il pulsante tipo di azione nel codice.

[self dismissViewControllerAnimated:YES completion:nil];

Swift

Aggiornamento per Swift 3

 entrare descrizione dell'immagine qui

Storyboard

Creare due View Controller con un pulsante su ciascuno. Per il secondo controller della vista, impostare il nome della classe per SecondViewController e l'ID storyboard per secondVC.

Codice

ViewController.swift

import UIKit
class ViewController: UIViewController {

    @IBAction func presentButtonTapped(_ sender: UIButton) {

        let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let myModalViewController = storyboard.instantiateViewController(withIdentifier: "secondVC")
        myModalViewController.modalPresentationStyle = UIModalPresentationStyle.fullScreen
        myModalViewController.modalTransitionStyle = UIModalTransitionStyle.coverVertical
        self.present(myModalViewController, animated: true, completion: nil)
    }
}

SecondViewController.swift

import UIKit
class SecondViewController: UIViewController {

    @IBAction func dismissButtonTapped(_ sender: UIButton) {
        self.dismiss(animated: true, completion: nil)
    }
}

Fonte:

presentModalViewController:

MainViewController *mainViewController=[[MainViewController alloc]init];
[self.navigationController presentModalViewController:mainViewController animated:YES];

dismissModalViewController:

[self dismissModalViewControllerAnimated:YES];

Swift

self.dismissViewControllerAnimated(true, completion: nil)

Il modo più semplice per farlo sta usando Storyboard e un Segue.

Basta creare un Segue dal FirstViewController (non il controller di navigazione) del TabBarController ad un LoginViewController con l'interfaccia utente di accesso e il nome "showLogin".

Creare un metodo che restituisce un BOOL per convalidare se l'utente connesso e / o il suo / sua sessione è valida ... preferibilmente sul AppDelegate. Chiamatela isSessionValid.

Sul vostro FirstViewController.m l'override del metodo viewDidAppear come segue:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    if([self isSessionValid]==NO){
        [self performSegueWithIdentifier:@"showLogin" sender:self];
    }
}

Poi, se l'utente loggato con successo, basta respingere o pop-out la LoginViewController per mostrare le schede.

funziona al 100%!

Speranza che aiuta!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top