Navigieren Sie programmgesteuert zu einem anderen Ansichtscontroller / einer anderen Szene


77

Beim Navigieren vom First View Controller zum Second View Controller wurde eine Fehlermeldung angezeigt. Meine Codierung ist wie diese

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

Das Problem ist, dass ich immer diese Art von Fehlermeldung habe

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)

Sie müssen LoginViewController.xibIhrem Projekt eine Datei hinzufügen . LoginViewController.swiftStellen Sie beim Erstellen sicher, dass include xib ausgewählt ist.
Gabbler

Versuchen Sie, einen komplett neuen Ansichts-Controller hinzuzufügen und zu ersetzen, LoginViewControllerund prüfen Sie, ob er funktioniert.
Gabbler

Übrigens, ich benutze Storyboard
Mohammad Nurdin

Ich auch, ich benutze Storyboard und habe Ihren Code verwendet, um eine XIB-Datei zu laden, und es hat bei mir funktioniert.
Gabbler

Um auf ein Storyboard in Ihrem Code zuzugreifen, müssen Sie die Storyboard-ID in Ihrem Storyboard festlegen.
Noah

Antworten:


134

Ich habe die Antwort bereits gefunden

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)

6
Innerhalb eines ViewControllers können Sie mit self.StoryBoard
Michael Brown

3
es verbirgt die "Navigationsleiste"
Danny182

15
@ Danny182 Wenn Sie möchten, dass die Navigationsleiste angezeigt wird, verwenden Sieself.navigationController?.pushViewController(nextViewController, animated: true)
Fever

1
Was ist, wenn es ein UINavigationController-Tag für UITabbarViewController gibt, wie UINavigationController in diesem Fall zu pushen ist?
Kiran

Es (Swift 4) präsentiert den neuen View Controller modal
subair_a

43

Probier diese. Hier ist "LoginViewController" die im Storyboard angegebene Storyboard-ID.

Siehe unten

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

Ich war überrascht, dass Nurdins Antwort vorgeschlagen wurde, zu funktionieren (und das tat es nicht), weil es nur Push rief. Dies
Sirenen

41

XCODE 8.2 UND SWIFT 3.0

Präsentieren Sie eine Existenz UIViewController

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

Push an exist UIViewController

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

Denken Sie daran, dass Sie den UIViewControllerBezeichner folgendermaßen eingeben können:

  • Wählen Main.storyboard
  • Wähle Deine UIViewController
  • Suchen Sie die Dienstprogramme auf der rechten Seite
  • Wählen Sie den Identitätsinspektor aus
  • Suche im Abschnitt Identität "Storyboard ID"
  • Geben Sie die Kennung für Ihre UIViewController

Geben Sie hier die Bildbeschreibung ein


1
Richtige Antwort, ich habe abgestimmt, aber warum brauchen wir "Restoration ID"? Ich glaube, "Storyoard ID" ist genug für diese Situation.
Yucel Bayram

Vielen Dank für Ihr Feedback @yucelbayram Eine Wiederherstellungskennung ist eine Zeichenfolge, die Sie jedem Ansichtscontroller oder jeder Ansicht zuweisen müssen, die beibehalten und wiederhergestellt werden soll. In meinem Fall verwende ich dieses Feld, weil ich eine bestimmte Funktion benötige. Wenn Sie sie jedoch nicht benötigen, können Sie sie entfernen.
Cristian Mora

15

Wenn Sie zu einem programmgesteuert erstellten Controller navigieren möchten, gehen Sie folgendermaßen vor:

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

Wenn Sie mit dem Bezeichner "newViewController" zu Controller auf StoryBoard navigieren möchten, gehen Sie folgendermaßen vor:

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

10

Siehe meine.

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

Wenn Sie den Präsentationsstil verwenden, verlieren Sie möglicherweise die Navigationsleiste der Seite mit der voreingestellten Pushnavigation.


10

Sie können programmgesteuert mit dem folgenden Code von einer Szene zur nächsten wechseln:

  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) 

Hier ist storyBoardID ein Wert, den Sie mit Interface Builder auf Szene setzen. Dies ist unten gezeigt:

Screenshot zum Festlegen der Storyboard-ID


10

Swift3:

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

Probieren Sie es aus. Sie haben gerade Feder mit Storyboard-Darstellung verwechselt.


6

Programmatisch gibt es verschiedene Möglichkeiten, die auf unterschiedlichen Situationen basieren

  1. Laden Sie den Storyenter-Code in die Nib-Datei

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

    let yourVc = YourViewController.init(nibName: "YourViewController", bundle: nil)
    self.present(yourVc, animated: true, completion: nil)
    
  3. Navigieren Sie durch Segue

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

Vielen Dank. Ich habe versucht, die Methode für ein xib zu verwenden, stattdessen brauchte ich die für ein Storyboard. Ihre Antwort hat mir sehr geholfen!
Jonas Deichelmann

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

2

Sie können mithilfe von Storyboard und StoryboardId des View Controllers mithilfe von Code zwischen Ansichts-Controllern navigieren. Dieser Code ist für Swift 3:

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

Gibt es eine Einführung oder Erklärung für den Code in Ihrer Antwort? Vielleicht ein erster Satz wie "Ich denke, Sie wollen Code wie diesen:".
Louis Langholtz

2

XCODE 9.2 UND SWIFT 3.0

ViewControllerbis NextViewcontrollerohne Segue-Verbindung

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

oder

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

1

Ich gebe Ihnen meinen Code für einen Übergang. In diesem Beispiel stellt die Aktion eine Verbindung zu einem UIButton her. Vergessen Sie also nicht, es einzustellen. Vergessen Sie nicht, den Namen Ihres ViewControllers in der transitionMethode festzulegen .

Vergessen Sie nicht, auch Ihr Storyboard einzurichten. Sie benötigen eine Ansicht pro viewController. Verbinden Sie jeden ViewController mit jeder Ansicht in storyBoard. Sie können auf dem Screenshot unten sehen

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

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

Wenn Sie eine Benutzeroberfläche ohne Drag & Drop erstellen (ohne Storyboard zu verwenden) und die Standardseite oder ViewController.swift zu einer anderen Seite navigieren möchten? Befolgen Sie diese Schritte 1) Fügen Sie eine Klasse hinzu (.swift) 2) Importieren Sie UIKit 3) Deklarieren Sie den Klassennamen wie

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)
    }
}

Nach dem Erstellen der zweiten Seite kehren Sie zur ersten Seite zurück (ViewController.swift). Erstellen Sie hier eine Schaltfläche in der viewDidLoad-Methode

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)

Definieren Sie jetzt die buttonAction-Methode außerhalb von viewDidLoad () in derselben Klasse

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

Behalte eine Sache, die ich vergessen habe, in main.storyboard, es gibt eine Szene mit einem Pfeil, wähle diesen Pfeil aus und drücke die Entf-Taste

Ziehen Sie nun einen Navigationscontroller per Drag & Drop und löschen Sie die mit dem Navigation Controller gelieferte Tabellenansicht. Wählen Sie den Navigationscontroller aus, drücken Sie die Steuerungstaste auf der Tastatur und ziehen Sie ihn in eine andere Szene im Storyboard, ViewController. Dies bedeutet, dass Ihr Viewcontroller zum Root-Viewcontroller wird. Ich hoffe, dies hilft Ihnen. Vielen Dank in main.storyboard, Drag & Drop-Navigationscontroller.


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

3
Sie müssen einige Inhalte um Ihre Antwort hinzufügen und sie ein wenig erklären.
Sparrow

1

Zusätzlich zu den oben genannten guten Antworten, um den Navigationsansichts-Controller in Ihrer App oben auf Ihrem Bildschirm festzulegen , können Sie ihn wie folgt zu Ihrer AppDelegate.swift- Datei innerhalb des Blocks hinzufügen

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

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

    return true

}

1

Swift 4.0.3

 @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)

    }

Ändern Sie unseren Controllernamen RegisterNewUserViewController


Es sollte seinstoryboard
Lucas

1

Ich denke, Sie suchen so etwas:

let signUpViewController = SignUpViewController()
present(signUpViewController, animated: true, completion: nil)

Wenn Sie die neue Seite im Vollbildmodus anzeigen möchten:

present(signUpViewController, animated: true, completion: nil)

Hoffe das hilft :)


0

Ich bin nicht sicher, ob ich die folgenden Schritte versuchen soll. Ich denke, dass unter den Gründen ein Fehler auftritt.

  • Sie benennen einige Dateien außerhalb von XCode um. Um dies zu lösen, entfernen Sie die Dateien aus Ihrem Projekt und importieren Sie die Dateien in Ihr Projekt erneut.
  • Überprüfen und fügen Sie fehlende Nib-Dateien in den Erstellungsphasen-> Bundle-Ressourcen kopieren hinzu. Überprüfen Sie schließlich die Schreibweise des Nib-Namens.
  • Überprüfen Sie die Eigenschaften der .xib / Storyboard - Dateien im Datei - Inspektor , die Eigenschaft „ Ziel Membership “ pitch auf der Auswahlbox, dann xib / Storyboard - Datei wurde mit dem Ziel verknüpft.
  • B. falscher NIB-Typ. Klicken Sie mit der rechten Maustaste auf die Datei und klicken Sie auf "Informationen abrufen", um zu überprüfen, ob der Typ Ihren Erwartungen entspricht.

0
 let vc = DetailUserViewController()
 vc.userdetails = userViewModels[indexPath.row]
 self.navigationController?.pushViewController(vc, animated: true)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.