【问题标题】:presenting ViewController with NavigationViewController swift用 NavigationViewController 快速呈现 ViewController
【发布时间】:2014-10-16 03:24:54
【问题描述】:

我有系统“NavigationViewController -> MyViewController”,我想以编程方式将 MyViewController 呈现在第三个视图控制器中。问题是 MyViewController 中没有导航栏。你能帮助我吗?

var VC1 = self.storyboard.instantiateViewControllerWithIdentifier("MyViewController") as ViewController
self.presentViewController(VC1, animated:true, completion: nil)

【问题讨论】:

    标签: ios swift uinavigationcontroller uinavigationbar viewcontroller


    【解决方案1】:

    调用presentViewController 会在现有导航堆栈之外模态呈现视图控制器;它不包含在您的 UINavigationController 或任何其他内容中。如果你想让你的新视图控制器有一个导航栏,你有两个主要选择:

    选项 1. 将新的视图控制器推送到您现有的导航堆栈上,而不是模态显示它:

    let VC1 = self.storyboard!.instantiateViewControllerWithIdentifier("MyViewController") as! ViewController
    self.navigationController!.pushViewController(VC1, animated: true)
    

    选项 2. 将新视图控制器嵌入新导航控制器并以模态方式呈现新导航控制器:

    let VC1 = self.storyboard!.instantiateViewControllerWithIdentifier("MyViewController") as! ViewController
    let navController = UINavigationController(rootViewController: VC1) // Creating a navigation controller with VC1 at the root of the navigation stack.
    self.present(navController, animated:true, completion: nil)
    

    请注意,此选项不会自动包含“返回”按钮。你必须自己建立一个关闭机制。

    哪个最适合您是一个人机界面设计问题,但通常很清楚什么最有意义。

    【讨论】:

    • 我怎样才能使新的视图控制器从右到左,而不是从下往上?谢谢
    • 好的。但是我怎样才能关闭模态呢?
    • MyViewController (ViewController) 已经通过 StoryBoard 链接到 NavigationController。然后选项 1,不起作用,它的当前导航控制器没有导航栏!
    • 如果看到双 NavigationBar 就写这行代码。 navController.isNavigationBarHidden = true
    【解决方案2】:

    我的导航栏没有显示,所以我在 Swift 2 iOS 9 中使用了以下方法

    let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("Dashboard") as! Dashboard
    
    // Creating a navigation controller with viewController at the root of the navigation stack.
    let navController = UINavigationController(rootViewController: viewController)
    self.presentViewController(navController, animated:true, completion: nil)
    

    【讨论】:

      【解决方案3】:

      SWIFT 3

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

      【讨论】:

        【解决方案4】:

        我使用了 UIViewController 的扩展和一个结构来确保我当前的视图是从收藏夹中呈现的

        1.全局布尔型结构

        struct PresentedFromFavourites {
        static var comingFromFav = false}
        

        2.UIVeiwController 扩展:通过“stefandouganhyde - 选项 2”以模态方式呈现,如第二个选项并解决后面

        extension UIViewController {
        func returnToFavourites()
        {
            // you return to the storyboard wanted by changing the name
            let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil)
            let mainNavigationController = storyBoard.instantiateViewController(withIdentifier: "HomeNav") as! UINavigationController
            // Set animated to false
            let favViewController = storyBoard.instantiateViewController(withIdentifier: "Favourites")
            self.present(mainNavigationController, animated: false, completion: {
                mainNavigationController.pushViewController(favViewController, animated: false)
            })
        
        }
        // call this function in viewDidLoad()
        // 
        func addBackToFavouritesButton()
        {
            if PresentedFromFavourites.comingFromFav
            {
                //Create a button
                // I found this good for most size classes
                let buttonHeight = (self.navigationController?.navigationBar.frame.size.height)! - 15
                let rect = CGRect(x: 2, y: 8, width: buttonHeight, height: buttonHeight)
                let aButton = UIButton(frame: rect)
                // Down a back arrow image from icon8 for free and add it to your image assets  
                aButton.setImage(#imageLiteral(resourceName: "backArrow"), for: .normal)
                aButton.backgroundColor = UIColor.clear
                aButton.addTarget(self, action:#selector(self.returnToFavourites), for: .touchUpInside)
                self.navigationController?.navigationBar.addSubview(aButton)
                PresentedFromFavourites.comingFromFav = false
            }
        
        }}
        

        【讨论】:

          【解决方案5】:

          接受的答案很棒。这不是答案,而只是问题的说明。

          我呈现一个这样的viewController:

          vc1 内部:

          func showVC2() {
              if let navController = self.navigationController{
                  navController.present(vc2, animated: true)
              }
          }
          

          vc2 内部:

          func returnFromVC2() {
              if let navController = self.navigationController {
                  navController.popViewController(animated: true)
              }else{
                  print("navigationController is nil") <-- I was reaching here!
              }
          }
          

          正如“stefandouganhyde”所说:“它不包含在您的 UINavigationController 或任何其他内容中”

          新解决方案:

          func returnFromVC2() {
              dismiss(animated: true, completion: nil)
          }
          

          【讨论】:

            猜你喜欢
            • 2020-12-20
            • 1970-01-01
            • 2020-10-19
            • 1970-01-01
            • 2017-11-19
            • 1970-01-01
            • 1970-01-01
            • 2018-03-07
            • 1970-01-01
            相关资源
            最近更新 更多