以编程方式导航到另一个视图控制器/场景

Moh*_*din 66 uiviewcontroller uinavigationcontroller ios swift xcode6

从第一个视图控制器导航到第二个视图控制器时出现错误信息.我的编码就像这个

let vc = LoginViewController(nibName: "LoginViewController", bundle: nil)
self.navigationController?.pushViewController(vc, animated: true)
Run Code Online (Sandbox Code Playgroud)

问题是我总是收到这种错误信息

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)
Run Code Online (Sandbox Code Playgroud)

Moh*_*din 120

我已经找到了答案

斯威夫特4

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

斯威夫特3

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

let nextViewController = storyBoard.instantiateViewControllerWithIdentifier("nextView") as NextViewController
self.presentViewController(nextViewController, animated:true, completion:nil)
Run Code Online (Sandbox Code Playgroud)

  • @ Danny182如果要显示导航栏,请使用`self.navigationController?.pushViewController(nextViewController,animated:true)` (13认同)
  • 在ViewController中,您可以使用self.StoryBoard访问故事板 (6认同)
  • 它隐藏了"导航栏" (2认同)

小智 43

试试这个吧.这里"LoginViewController"是storyboard中指定的storyboardID.

见下文

let secondViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as LoginViewController
self.navigationController?.pushViewController(secondViewController, animated: true)
Run Code Online (Sandbox Code Playgroud)


Cri*_*ora 39

XCODE 8.2和SWIFT 3.0

目前存在 UIViewController

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

推动存在 UIViewController

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

请记住,您可以按照UIViewController以下步骤放置标识符:

  • 选择 Main.storyboard
  • 选择你的 UIViewController
  • 搜索右侧的实用程序
  • 选择身份检查器
  • 在部分标识中搜索"故事板ID"
  • 把标识符放在你的身上 UIViewController

在此输入图像描述


jai*_*jan 12

如果要导航到以编程方式创建的Controller,请执行以下操作:

let newViewController = NewViewController()
self.navigationController?.pushViewController(newViewController, animated: true)
Run Code Online (Sandbox Code Playgroud)

如果要使用标识符"newViewController"导航到StoryBoard上的Controller,请执行以下操作:

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


A.G*_*A.G 10

见我的.

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

如果使用呈现样式,则可能会丢失具有预设pushnavigation的页面导航栏.


Ari*_*bas 9

Swift3:

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

试试吧.你只是把笔尖与故事板表示混淆了.


Jay*_*bey 9

您可以使用以下代码以编程方式从一个场景移动到另一个场景:

  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) 
Run Code Online (Sandbox Code Playgroud)

这里storyBoardID是您使用Interface Builder设置为场景的值.如下所示:

有关如何设置storyboardID的屏幕截图


Bha*_*anu 6

编程上根据不同情况有不同的方法

  1. 在此处加载 storyenter 代码 nib 文件

    let yourVc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "YourViewController") as! YourViewController;
    self.present(yourVc, animated: true, completion: nil)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 从xib加载

    let yourVc = YourViewController.init(nibName: "YourViewController", bundle: nil)
    self.present(yourVc, animated: true, completion: nil)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 浏览 Segue

    self.performSegue(withIdentifier: "your UIView", sender: self)
    
    Run Code Online (Sandbox Code Playgroud)