Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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
导航栏不显示iOS swift_Ios_Swift_Uinavigationcontroller - Fatal编程技术网

导航栏不显示iOS swift

导航栏不显示iOS swift,ios,swift,uinavigationcontroller,Ios,Swift,Uinavigationcontroller,我的应用程序中有多视图控制器。我想在我的第一个视图控制器中隐藏导航栏。因此,我使用以下代码隐藏导航栏 navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true); 现在我想在其他一些viewController中添加导航栏,但我的导航栏在该viewController中不可见。为什么会这样 我的故事板显示了导航栏,但一旦我尝试运行

我的应用程序中有多视图控制器。我想在我的第一个视图控制器中隐藏导航栏。因此,我使用以下代码隐藏导航栏

navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true);
现在我想在其他一些viewController中添加导航栏,但我的导航栏在该viewController中不可见。为什么会这样

我的故事板显示了导航栏,但一旦我尝试运行我的应用程序,它就消失了

若我从一个视图控制器隐藏导航栏,那个么我们就不能使用导航控制器,是这样吗?我希望我错了。那么,导航栏未显示的原因是什么

编辑:

此外,我希望我的视图控制器仅处于纵向模式。所以我做了以下几点,这是导致问题的原因吗

extension UINavigationController{
    public override func shouldAutorotate() -> Bool {
        if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft ||
            UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeRight ||
            UIDevice.currentDevice().orientation == UIDeviceOrientation.Unknown) {
                return false
        }
        else {
            return true
        }
    }
    
    public override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        return [UIInterfaceOrientationMask.Portrait ,UIInterfaceOrientationMask.PortraitUpsideDown]
    }
    

}
编辑1:

我使用以下代码从一个视图控制器移动,而不是从故事板链接。现在这是问题的根源吗

 let storyboard = UIStoryboard(name: "Main", bundle: nil)
        let secondViewController = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
        presentViewController(secondViewController, animated: false, completion: nil)
编辑2:

请检查我下面的截图。我的secondview控制器设置是什么

编辑3:

这是我的导航控制器属性检查器

导航控制器是一个控制器,它具有视图控制器堆栈。所以如果你有这样的东西:

导航->A->(分段)B

即使你隐藏了导航栏,你仍然应该能够进行分段。你们不能在第二(B)视图中取消隐藏导航栏吗?视图中的控制器会出现吗?首先,以同样的方式在视图中隐藏它

编辑:问题的最终解决方案: 使用:

而不是:

let secondViewController = storyboard.instantiateViewControllerWithIdentifier("HomeVC")
presentViewController(secondViewController, animated: false, completion: nil)

因为pushViewController会将secondViewController添加到其堆栈中。presentViewController正在替换导航控制器,这就是您无法看到导航栏的原因。

在视图控制器的viewDidLoad方法中,您不希望在其中显示导航栏添加行

navigationController.navigationBarHidden = true
您当前隐藏在所有视图控制器中

编辑:您显示的是视图控制器,它应该是

self.navigationController!.pushViewController(controller) 

我在我的swift项目中有相同的要求

这就是我处理导航栏的方式

override func viewWillAppear(animated: Bool)
    {
         super.viewWillAppear(animated)

        //hide navigation for screen A
        self.navigationController?.navigationBarHidden = true
    }
确保您的第一个屏幕已嵌入导航控制器

示例我们有两个屏幕A和B

在屏幕A中,您需要隐藏视图中的导航栏将出现

override func viewWillAppear(animated: Bool)
    {
         super.viewWillAppear(animated)

        //hide navigation for screen A
        self.navigationController?.navigationBarHidden = true
    }
用于在屏幕B中启用导航 您需要在屏幕A中添加以下代码

override func prepareForSegue(segue: (UIStoryboardSegue!), sender: AnyObject!)
    {
        if (segue.identifier == "screen B's segue identifier here")
        {
           //enable navigation for screen B       
            navigationController?.setNavigationBarHidden(navigationController?.navigationBarHidden == false, animated: true)
        }

    }

使用上述样式,我可以启用或禁用特定屏幕的导航栏,只要我想

如果您需要将此导航栏仅隐藏在该控制器中,最好的方法是在
viewwilldisease()
中显示它,并隐藏在
viewwilldisease()中

现在回复太晚了,还有其他好的答案,但我想分享一下对我有用的东西

let controller = self.storyboard?.instantiateViewControllerWithIdentifier("HomeVC")
    self.navigationController!.pushViewController(controller!, animated:true)

使用Swift 4.0在基于
viewcontroller
的隐藏中执行类似操作

要在
视图中隐藏
导航控制器
,将出现

override func viewWillAppear(animated: Bool) {
     super.viewWillAppear(animated)
    self.navigationController?.isNavigationBarHidden = true
}
视图中取消隐藏
导航控制器
将消失

override func viewWillDisappear(animated: Bool)
{
    super.viewWillDisappear(animated)
    self.navigationController?.isNavigationBarHidden = false
}


您正在对整个导航控制器堆栈进行设置,以便它在放置在导航控制器上的视图控制器上不可见。如果只需要在某些视图控制器上禁用,只需执行[self.navigationController setNavigationBarHidden:YES];在视图控制器的viewDidLoad方法中,kSEGUE\u ID\u MANAGE\u帐户是什么?这是下一个屏幕的segue标识符我想我做错了什么。我将这个“kSEGUE\u ID\u MANAGE\u ACCOUNT”替换为“StoryBoard ID”。还是不走运。啊,对不起,实际上我对segue使用常量,就像这样让kSEGUE\u ID\u MANAGE\u ACCOUNT=“loadManageAccountSegue”它仍然不工作。你能检查我编辑的问题吗?你可以使用Objc Swift converter()和post,你的答案会更有用。请检查我的编辑2:我遗漏了什么吗?你的第二个视图控制器没有分配给某个类。请看你的屏幕截图,它没有显示分配的任何视图控制器类。您还将演示视图控制器。相反,您需要推送视图控制器self.navigationController!。pushViewController(控制器)顺便说一句,你确定你的第二个视图控制器是从UIViewController继承的吗?是的,一切都是viewcontroller,但我的问题我像presntviewcontroller一样调用。我需要像pushviewcontroller一样调用..所以没有办法再次启用导航栏吗?为什么启用?你一开始并没有禁用它。您只需像其他普通视图一样隐藏它。所以你总是可以取消隐藏它。我的另一个问题是我没有隐藏我的第一个导航栏,导航栏在第二个视图控制器中不可见。确保你没有第二个导航视图控制器,但只有一个。是的,它不会这样工作。navigationController.pushViewController应该执行此操作。我尝试了此操作,但未成功。请检查我的编辑问题。请检查我的编辑2:我遗漏了什么吗?谢谢你的逻辑是完美的解决方案是的,我做错了的是我调用了新的视图控制器,就像这个presentViewController(secondViewController,动画:false,完成:nil)。但我需要使用这个navigationController!。pushViewController(控制器,动画:false)@Makalele查找错误。@Amsheer--sry I foget要问这个问题,当前视图控制器不显示/嵌入导航控制器,如果要执行此操作,需要手动嵌入导航控制器。否则,你需要将其转换为推式viewcontrollerI。我尝试过这样做,但不起作用。请检查我的编辑2:我错过了什么吗?谢谢你的逻辑是正确的,但我的代码出错了。
override func viewWillDisappear(animated: Bool)
{
    super.viewWillDisappear(animated)
    self.navigationController?.isNavigationBarHidden = false
}