web-dev-qa-db-fra.com

Comment passer à un nouveau contrôleur de vue avec code uniquement avec Swift

Je souhaite passer de ViewController à secondViewController, lorsque l'utilisateur appuie sur un bouton UIButton, en utilisant du code uniquement dans Swift.

//Function to transition
func transition(Sender: UIButton!)
{   
    //Current Code, default colour is black
    let secondViewController:UIViewController = UIViewController()
    self.presentViewController(secondViewController, animated: true, completion: nil)

 }
47
Stephen Fox

Le problème est que votre code crée un UIViewController vierge, pas un SecondViewController. Vous devez créer une instance de votre sous-classe, pas un UIViewController,

func transition(Sender: UIButton!) {   
    let secondViewController:SecondViewController = SecondViewController()

    self.presentViewController(secondViewController, animated: true, completion: nil)

 }

Si vous avez remplacé init (nibName nibName: String!, Bundle nibBundle: NSBundle!) Dans votre classe SecondViewController, vous devez modifier le code en,

let sec: SecondViewController = SecondViewController(nibName: nil, bundle: nil)
59
rdelmar

Cela a parfaitement fonctionné pour moi:

func switchScreen() {
    let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
    if let viewController = mainStoryboard.instantiateViewController(withIdentifier: "yourVcName") as? UIViewController {
        self.present(viewController, animated: true, completion: nil)
    }
}
36
user3723418

rapide

Habituellement, pour la transition normale, nous utilisons,

let next:SecondViewController = SecondViewController()
self.presentViewController(next, animated: true, completion: nil)

Mais parfois, lorsque vous utilisez le contrôleur de navigation, vous pouvez être confronté à un écran noir. Dans ce cas, vous devez utiliser comme,

let next:ThirdViewController = storyboard?.instantiateViewControllerWithIdentifier("ThirdViewController") as! ThirdViewController
self.navigationController?.pushViewController(next, animated: true)

De plus, aucune des solutions ci-dessus ne conserve la barre de navigation lorsque vous appelez un storyboard ou un seul xib vers un autre xib. Si vous utilisez la barre de navigation et que vous souhaitez la conserver comme la Push normale, vous devez utiliser,

Disons que "MyViewController" est l'identifiant de MyViewController

let viewController = MyViewController(nibName: "MyViewController", bundle: nil)
self.navigationController?.pushViewController(viewController, animated: true)
15

Votre code est parfait. Si vous obtenez un écran noir, c'est parce qu'il n'y a rien sur votre deuxième contrôleur de vue.

Essayez quelque chose comme:

secondViewController.view.backgroundColor = UIColor.redColor();

Maintenant, le contrôleur de vue qu'il montre doit être rouge.

Pour faire quelque chose avec secondViewController, créez une sous-classe de UIViewController et au lieu de

let secondViewController:UIViewController = UIViewController()

créez une instance de votre second contrôleur de vue:

//If using code
let secondViewController = MyCustomViewController.alloc()

//If using storyboard, assuming you have a view controller with storyboard ID "MyCustomViewController"
let secondViewController = self.storyboard.instantiateViewControllerWithIdentifier("MyCustomViewController") as UIViewController
9
Lord Zsolt

Pour ceux qui utilisent un second contrôleur de vue avec un storyboard dans un fichier .xib, vous voudrez utiliser le nom du fichier .xib dans votre constructeur (sans le suffixe .xib).

let settings_dialog:SettingsViewController = SettingsViewController(nibName: "SettingsViewController", bundle: nil)
self.presentViewController(settings_dialog, animated: true, completion: nil)
3
DaveUT

Dans Swift 2.0, vous pouvez utiliser cette méthode:

    let registrationView = LMRegistration()
    self.presentViewController(registrationView, animated: true, completion: nil)
2

Pour ceux qui le font sur iOS8, voici ce que je devais faire:

J'ai un fichier de classe Swift intitulé SettingsView.Swift et un fichier .xib nommé SettingsView.xib. Je lance ceci dans MasterViewController.Swift (ou n’importe quel contrôleur de vue pour ouvrir réellement un second contrôleur de vue)

@IBAction func openSettings(sender: AnyObject) {
        var mySettings: SettingsView = SettingsView(nibName: "SettingsView", bundle: nil) /<--- Notice this "nibName" 
        var modalStyle: UIModalTransitionStyle = UIModalTransitionStyle.CoverVertical
        mySettings.modalTransitionStyle = modalStyle
        self.presentViewController(mySettings, animated: true, completion: nil)

    }
2
Garfonzo

Utilisez toujours le fichier nibName, sinon votre contenu préchargé de Xib ne s'affichera pas.

vc : ViewController =  ViewController(nibName: "ViewController", bundle: nil) //change this to your class name

 self.presentViewController(vc, animated: true, completion: nil)
1
Alok

Mis à jour pour Swift 3, certaines de ces réponses sont un peu dépassées.

let mainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        let vc : UIViewController = mainStoryboard.instantiateViewController(withIdentifier: "myStoryboardID") as UIViewController
        self.present(vc, animated: true, completion: nil)    }
1
Matt Bart