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

Vic*_*tor 62 uinavigationbar viewcontroller ios swift

我正在使用以下代码以编程方式导航到另一个ViewController.它工作正常,但有些隐藏了navigation bar.我该如何解决?(导航栏被embeding创建ViewControllernavigation controller,如果该事项).

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)

jai*_*jan 158

在Swift 3中

使用以编程方式创建的Controller

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

newViewController.modalPresentationStyle = .fullScreen
Run Code Online (Sandbox Code Playgroud)

用StoryBoard创建了Controller

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

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

  • 从主线程调用`storyBoard.instantiateViewController`和`self.present`,否则你会出现viewController组件的延迟 (4认同)
  • 故事板选项中不需要“as!NewViewController” (2认同)
  • 是的,我知道这是可选的,但是如果显示,则可以清楚地看到哪个viewcontroller是另一个开发人员的目标 (2认同)
  • @Alex看,是由开发人员从主线程调用它的,我刚刚写了上面问的问题的答案。您从主线程调用的注释在这里不合适。 (2认同)
  • 嗨偷看:作为一般规则,我可以建议更友好的语气吗?(这是SO上的一个相当大的问题)相反的主题:虽然OP没有直接询问它,但我认为这个好的答案仍然是一个合适的地方(对于任何阅读的人)记住动作必须在主线程上发生 (2认同)

zee*_*han 21

SWIFT 4.x

双引号中的字符串总是让我困惑,所以我认为对这个问题的回答需要一些图形表示来清除这一点.

对于银行应用程序,我有一个LoginViewController和一个BalanceViewController.每个都有各自的屏幕.

该应用程序启动并显示登录屏幕.登录成功后,应用程序将打开"余额"屏幕.

以下是它的外观:

在此输入图像描述

在此输入图像描述

登录成功的处理方式如下:

let storyBoard: UIStoryboard = UIStoryboard(name: "Balance", bundle: nil)
let balanceViewController = storyBoard.instantiateViewController(withIdentifier: "balance") as! BalanceViewController
self.present(balanceViewController, animated: true, completion: nil)
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,故事板ID'balance'用小写字母表示代码的第二行,这是故事板设置中定义的ID,如附带的屏幕截图所示.

带有大写'B'的术语'Balance'是storyboard文件的名称,它在代码的第一行中使用.

我们知道在代码中使用硬编码字符串是一种非常糟糕的做法,但在iOS开发中它已经成为一种常见的做法,Xcode甚至都没有对它们发出警告.


oca*_*nal 14

您应该使用当前导航控制器推送新的viewcontroller,而不是存在.

self.navigationController.pushViewController(nextViewController, animated: true)
Run Code Online (Sandbox Code Playgroud)


And*_*nes 9

根据@jaiswal Rajan 的回答。您可以像这样执行pushViewController:

let storyBoard: UIStoryboard = UIStoryboard(name: "NewBotStoryboard", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "NewViewController") as! NewViewController
self.navigationController?.pushViewController(newViewController, animated: true)
Run Code Online (Sandbox Code Playgroud)


Aks*_*Aks 5

所以如果你展示一个视图控制器,它不会显示在导航控制器中。它只需要完整的屏幕。对于这种情况,您必须创建另一个导航控制器并nextViewController为此添加您的root 用户并呈现这个新的导航控制器。

另一种方法是推送视图控制器。

self.presentViewController(nextViewController, animated:true, completion:nil)
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看 Apple 文档:- https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/#//apple_ref/doc/uid/TP40006926-CH3-SW96


小智 5

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

当我将代码放入 中时OperationQueue.main.addOperation,它对我有用,它将在我的主线程中执行。