Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何将导航控制器添加到';它不是最初的UIViewController_Swift_Swift4 - Fatal编程技术网

Swift 如何将导航控制器添加到';它不是最初的UIViewController

Swift 如何将导航控制器添加到';它不是最初的UIViewController,swift,swift4,Swift,Swift4,好的,我希望这个问题的标题有意义。基本上,我有一个应用程序,有一个登录屏幕,一旦你登录,它会带你到另一个视图控制器。登录屏幕被设置为初始视图控制器,它没有导航控制器,因为我不希望用户返回该屏幕,除非他们注销。因此,我通过storyboard向mainViewController添加了一个导航控制器,它是登录后显示的控制器。但导航控制器未显示。我不确定这是否与我展示mainViewController的方式有关,但我会向您展示我的代码,让您来评判 我从未在AppDelegate类中添加任何其他代

好的,我希望这个问题的标题有意义。基本上,我有一个应用程序,有一个登录屏幕,一旦你登录,它会带你到另一个视图控制器。登录屏幕被设置为初始视图控制器,它没有导航控制器,因为我不希望用户返回该屏幕,除非他们注销。因此,我通过storyboard向mainViewController添加了一个导航控制器,它是登录后显示的控制器。但导航控制器未显示。我不确定这是否与我展示mainViewController的方式有关,但我会向您展示我的代码,让您来评判


我从未在AppDelegate类中添加任何其他代码,因此我不确定是否必须在那里执行某些操作

您可以通过在UINavigationController中设置
rootViewController
以编程方式执行此操作`

let pushedViewController = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "mainViewController") as! mainViewController
let vc = UINavigationController.init(rootViewController: pushedViewController)
self.present(vc, animated: true, completion: nil)

如果您从情节提要中获取导航控制器,则显示导航控制器而不是
mainViewController

为此:

您可以将标识符分配给navigationController作为
“mainViewControllerNav”
,然后将代码更新为:

let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "mainViewControllerNav")
self.present(vc, animated: true, completion: nil)
现在您正在演示导航控制器,导航控制器将加载堆栈中的第一个viewcontroller,即您的
“mainViewController”

相反:

我建议您将登录和注销时的根目录更改为:

if let navVC = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "mainViewControllerNav") as? UINavigationController,
    let appDelegate = UIApplication.shared.delegate as? AppDelegate {
    appDelegate.window?.rootViewController = navVC
    appDelegate.window?.makeKeyAndVisible()
}

希望这对你有帮助。

是的,你说得对。您需要在AppDelegate类中添加UserDefault以检查登录的用户。然后添加条件语句以推送到登录屏幕或不推送到登录屏幕。@PiyushMathur,因此我不必将根视图控制器设置为我的导航,但下面的答案有效,因为我很笨,忘记了添加脚本标识符。谢谢你的回答,因为这同样有效!还有,我不明白为什么我的问题被否决了。如果你否决了我的问题,你能提供反馈吗?那不是我。但当问题重复时,会投反对票;当问题不清楚的时候。所以我想建议你先搜索与你相同的问题的答案。@PiyushMathur明白了,谢谢!这成功了!非常感谢。我太笨了…我以前有过这个,但忘了使用故事板标识符…而且,我不明白为什么我的问题被否决了。如果你否决了我的问题,你能提供反馈吗?@Mikekofer,Welcome:)因此我不必将根视图控制器设置为我的导航,但上面的答案起作用了,因为我很笨,忘了添加我的故事板标识符。谢谢你的回答,因为这同样有效!还有,我不明白为什么我的问题被否决了。如果你否决了我的问题,你能提供反馈意见吗?我不是被否决的人,我真的不明白为什么被否决。。。也许有人不喜欢这样一个事实:它给人一种文本墙的感觉,没有任何突出显示的关键组件。
if let navVC = UIStoryboard(name: "Main", bundle: Bundle.main).instantiateViewController(withIdentifier: "mainViewControllerNav") as? UINavigationController,
    let appDelegate = UIApplication.shared.delegate as? AppDelegate {
    appDelegate.window?.rootViewController = navVC
    appDelegate.window?.makeKeyAndVisible()
}