web-dev-qa-db-fra.com

Naviguer par programme vers un autre contrôleur de vue / scène

J'ai reçu un message d'erreur lors de la navigation du premier contrôleur de vue au second contrôleur de vue. Mon codage est comme celui-ci

let vc = LoginViewController(nibName: "LoginViewController", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)

Le problème est que j'ai toujours eu ce genre de message d'erreur

2014-12-09 16:51:08.219 XXXXX[1351:60b] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Could not load NIB in bundle: 'NSBundle </var/mobile/Applications/FDC7AA0A-4F61-47E7-955B-EE559ECC06A2/XXXXX.app> (loaded)' with name 'LoginViewController''
*** First throw call stack:
(0x2efcaf0b 0x39761ce7 0x2efcae4d 0x31b693f9 0x31ac1eaf 0x3191e365 0x317fe895 0x318a930d 0x318a9223 0x318a8801 0x318a8529 0x318a8299 0x318a8231 0x317fa305 0x3147631b 0x31471b3f 0x314719d1 0x314713e5 0x314711f7 0x3146af1d 0x2ef96039 0x2ef939c7 0x2ef93d13 0x2eefe769 0x2eefe54b 0x33e6b6d3 0x3185d891 0x4ccc8 0x4cd04 0x39c5fab7)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
64
Mohammad Nurdin

J'ai déjà trouvé la réponse

Swift 4

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "nextView") as! NextViewController
self.present(nextViewController, animated:true, completion:nil)

Swift 3

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)
118
Mohammad Nurdin

Essaye celui-là. Ici "LoginViewController" est l'ID de storyboard spécifié dans le storyboard.

Voir ci-dessous

let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController
self.navigationController?.pushViewController(secondViewController, animated: true)
43
user2885077

XCODE 8.2 ET Swift 3.0

Présenter un exist UIViewController

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.present(loginVC, animated: true, completion: nil)

Poussez un exist UIViewController

let loginVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "LoginViewController") as! LoginViewController
self.navigationController?.pushViewController(loginVC, animated: true)

Rappelez-vous que vous pouvez mettre l'identificateur UIViewController en suivant les étapes suivantes:

  • Sélectionnez Main.storyboard
  • Sélectionnez votre UIViewController
  • Rechercher les utilitaires à droite
  • Sélectionnez l'inspecteur d'identité
  • Rechercher dans la section identité "Storyboard ID"
  • Mettez l'identifiant pour votre UIViewController

enter image description here

39
Cristian Mora

Si vous souhaitez accéder au contrôleur créé par programme, procédez comme suit:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)

Si vous souhaitez accéder à Controller sur StoryBoard avec l'identificateur "newViewController", procédez comme suit:

let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
        self.present(newViewController, animated: true, completion: nil)
11
jaiswal Rajan

Voir le mien.

func actioncall () {
    let loginPageView = self.storyboard?.instantiateViewControllerWithIdentifier("LoginPageID") as! ViewController
    self.navigationController?.pushViewController(loginPageView, animated: true)
}

Si vous utilisez le style de présentation, vous risquez de perdre la barre de navigation de la page avec pushnavigation prédéfini.

10
A.G

Swift3:

let storyboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewController("LoginViewController) as UIViewController
self.navigationController?.pushViewController(vc, animated: true)

Essayez ceci. Vous venez de confondre plume avec représentation du storyboard.

9
Arif Fikri Abas

Vous pouvez passer d'une scène à une autre par programme en utilisant le code ci-dessous:

  let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

  let objSomeViewController = storyBoard.instantiateViewControllerWithIdentifier(“storyboardID”) as! SomeViewController

  // If you want to Push to new ViewController then use this
  self.navigationController?.pushViewController(objSomeViewController, animated: true)

  // ---- OR ----

  // If you want to present the new ViewController then use this
  self.presentViewController(objSomeViewController, animated:true, completion:nil) 

StoryBoardID est ici la valeur que vous définissez pour la scène à l'aide d'Interface Builder. Ceci est montré ci-dessous:

Screenshot for how to set storyboardID

9
Jayprakash Dubey

Programmatiquement, il y a différentes manières basées sur différentes situations

  1. charge le fichier nib du fichier storyboard

    let yourVc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") as! YourViewController self.present(yourVc, animated: true, completion: nil)

  2. Charger à partir de xib

    let yourVc = YourViewController.init(nibName: "YourViewController", bundle: nil) self.present(yourVc, animated: true, completion: nil)

  3. Naviguer dans Segue

    self.performSegue(withIdentifier: "your UIView", sender: self)

2
Bhanu
let VC1 = self.storyboard!.instantiateViewController(withIdentifier: "MyCustomViewController") as! ViewController
let navController = UINavigationController(rootViewController: VC1)
self.present(navController, animated:true, completion: nil)
2
MrMins

Je vous donne mon code pour faire une transition. Dans cet exemple, l'action se connecte à un UIButton. Alors n'oubliez pas de le définir. N'oubliez pas de définir le nom de votre ViewController dans la méthode transition.

N'oubliez pas de définir votre storyboard aussi. Votre besoin d'avoir une vue par viewController. Connectez chaque ViewController à chaque vue de storyBoard. Vous pouvez voir sur la capture d'écran ci-dessous

enter image description hereenter image description here

class PresentationViewController: UIViewController {
    override func viewDidLoad() {
         super.viewDidLoad()

         var playButton   = UIButton.buttonWithType(UIButtonType.System) as UIButton

         let image = UIImage(named: "YourPlayButton") as UIImage?

         playButton.frame = CGRectMake(0, 0, 100, 100)
         playButton.center = CGPointMake(self.view.frame.width/2, self.view.frame.height/2)
         playButton.addTarget(self, action: "transition:", forControlEvents:  UIControlEvents.TouchUpInside)
         playButton.setBackgroundImage(image, forState: UIControlState.Normal)

         self.view.addSubview(playButton)
    }


func transition(sender:UIButton!)
{
    println("transition")
    let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("YourSecondViewController") as UIViewController

    let window = UIApplication.sharedApplication().windows[0] as UIWindow
    UIView.transitionFromView(
        window.rootViewController!.view,
        toView: secondViewController.view,
        duration: 0.65,
        options: .TransitionCrossDissolve,
        completion: {
            finished in window.rootViewController = secondViewController
    })
}
}
1
Haox

Vous pouvez naviguer entre les contrôleurs de vue à l'aide de code à l'aide du storyboard et de storyboardId du contrôleur de vue. Ce code est pour Swift 3:

let signUpVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
self.navigationController?.pushViewController(signUpVC, animated: true)
1

XCODE 9.2 ET Swift 3.0

ViewController à NextViewcontroller sans connexion de séquence

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(nextViewController, animated:true)

ou

let VC:NextViewController = storyboard?.instantiateViewController(withIdentifier: "NextViewController") as! NextViewController
self.navigationController?.pushViewController(VC, animated: true)
0
Sreekanth P

Si vous construisez une interface utilisateur sans glisser-déposer (sans utiliser de scénarimage) et souhaitez naviguer dans la page par défaut ou ViewController.Swift vers une autre page? Suivez ces étapes 1) ajoutez une classe (.Swift) 2) Importez UIKit 3) Déclarez le nom de la classe comme

class DemoNavigationClass :UIViewController{
     override func viewDidLoad(){
         let lbl_Hello = UILabel(frame: CGRect(x:self.view.frame.width/3, y:self.view.frame.height/2, 200, 30));
lbl_Hello.text = "You are on Next Page"
lbl_Hello.textColor = UIColor.white
self.view.addSubview(lbl_Hello)
    }
}

après avoir créé la deuxième page, revenez à la première page (ViewController.Swift) Ici, créez un bouton dans la méthode viewDidLoad

let button = UIButton()
button.frame = (frame: CGRect(x: self.view.frame.width/3, y: self.view.frame.height/1.5,   width: 200, height: 50))
 button.backgroundColor = UIColor.red
 button.setTitle("Go to Next ", for: .normal)
 button.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
 self.view.addSubview(button)

maintenant définir la méthode buttonAction en dehors de viewDidLoad () dans la même classe

func buttonAction(sender: UIButton!) 
{
    let obj : DemoNavigationClass = DemoNavigationClass();
    self.navigationController?.pushViewController(obj, animated: true)
}

Gardez une chose que j'oublie dans main.storyboard: une scène avec une flèche, sélectionnez cette flèche et appuyez sur le bouton de suppression.

maintenant, faites glisser un contrôleur de navigation et supprimez la tableview fournie avec le contrôleur navaigation. sélectionnez navigationcontroller, appuyez sur les touches de contrôle du clavier et faites-les glisser vers une autre scène du scénario, ViewController. Cela signifie que votre contrôleur de vue devient le contrôleur principal. Nous espérons que cela vous aidera. Merci dans main.storyboard, faites glisser et déposez navigationcontroller,

0
Dilip Jangid

Swift 4.0.

 @IBAction func registerNewUserButtonTapped(_ sender: Any) {

        print("---------------------------registerNewUserButtonTapped --------------------------- ");

        let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)

        let nextViewController = storyBoard.instantiateViewController(withIdentifier: "RegisterNewUserViewController") as! RegisterNewUserViewController
        self.present(nextViewController, animated:true, completion:nil)

    }

Changer notre nom de contrôleur RegisterNewUserViewController

0
Keshav Gera

En plus des bonnes réponses ci-dessus pour définir le contrôleur de vue de navigation en haut de votre écran sur votre application, vous pouvez l'ajouter à votre fichier AppDelegate.Swift à l'intérieur du bloc, comme suit

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

    window = UIWindow()
    window?.makeKeyAndVisible()
    window?.rootViewController = UINavigationController(rootViewController: LoginViewController())

    return true

}
0
Ahmad Al-Baqawi

Je ne suis pas sûr d'essayer les étapes ci-dessous, je pense qu'une erreur peut se produire sous les raisons.

  • vous renommez des fichiers en dehors de XCode. Pour le résoudre, supprimez les fichiers de votre projet et réimportez-les dans votre projet.
  • vérifier et ajouter le fichier Nib manquant dans phases de construction-> copier les ressources du paquet. Enfin, vérifiez l'orthographe du nom du nib, elle est correcte, sensible à la casse.
  • vérifiez les propriétés des fichiers .xib/storyboard dans l'emplacement inspecteur de fichiers , de la propriété "Adhésion cible" dans la zone de sélection, votre fichier xib/storyboard étant lié à celui-ci votre cible.
  • type de NIB incorrect. Cliquez à droite sur le fichier, puis cliquez sur "Obtenir des informations" pour vérifier que le type correspond à vos attentes.
0
Itachi Uchiha
let signUpVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "SignUp")
// self.present(signUpVC, animated: false, completion: nil)
self.navigationController?.pushViewController(signUpVC, animated: true)
0
Sai kumar Reddy