在两个 viewController 之间导航

Posted

技术标签:

【中文标题】在两个 viewController 之间导航【英文标题】:Navigating between two viewController 【发布时间】:2015-06-01 06:02:51 【问题描述】:

我在appDelegate 中将我的初始ViewController 设置为rootViewController,因为我不使用情节提要。它看起来像这样:

var window: UIWindow?
var mainNavigationController: UINavigationController?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

    self.mainNavigationController = UINavigationController()
    var mainController: UIViewController? = TineLineViewController()
    self.mainNavigationController!.pushViewController(mainController!, animated: true)
    self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
    self.window!.rootViewController = mainController
    self.window!.makeKeyAndVisible()
     ...
       ...

我的应用程序正在运行,我的TineLineViewController 出现了。

我在这个类中有一个 UIButton 调用这个方法:

  func postLeft(_sender: AnyObject?)
    
        println("go to secound view..")
        let secondViewController = PostCreateController()

        let appDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
        self.navigationController?.presentViewController(secondViewController, animated: true, completion: nil)
        appDelegate.window?.rootViewController = secondViewController
    

这样,如果我按下按钮,屏幕会发生变化,我的secondViewController 会显示出来,没有动画......

如果我尝试以这种方式更改视图:

self.navigationController?.pushViewController(secondViewController, animated: true)

它仍然没有任何动画,并且在secoundViewController 显示我的应用程序崩溃并显示以下消息后:

* 由于未捕获的异常“UIViewControllerHierarchyInconsistency”而终止应用程序,原因:“将根视图控制器添加为视图控制器的子级:” * 首先抛出调用栈: (

我不知道在appDelagate 中设置我的rootviewController 类是否是最好的方法,以及为什么不将此行添加到我的potLeft 函数就无法导航:

appDelegate.window?.rootViewController = secondViewController

如果没有这行,我可以在我的应用程序控制台中看到 secondViewController viewDidLoad 方法被调用,但控制器没有出现,我收到这条消息到 cosole:

警告:试图展示不在窗口层次结构中的视图!

如何在不使用情节提要的情况下在两个视图之间导航?

【问题讨论】:

【参考方案1】:

1) 将 mainNavigationController 设置为 rootViewController 2) 使用self.navigationController?.pushViewController(secondViewController, animated: true)

说明

当您将 TineLineViewController 设置为应用程序的委托 rootViewController 属性时,从逻辑上讲,您的根视图控制器是 UINavigationController。这就是为什么你得到例外。

self.mainNavigationController = UINavigationController()
var mainController: UIViewController? = TineLineViewController()
self.mainNavigationController!.pushViewController(mainController!, animated: true)
self.window = UIWindow(frame: UIScreen.mainScreen().bounds)
// ERROR is here
// self.window!.rootViewController = mainController

// your root view controller should be navigation controller
self.window!.rootViewController = mainNavigationController

self.window!.makeKeyAndVisible()

【讨论】:

【参考方案2】:

您可以将secondViewController 设置为rootViewControllerrootViewController 动画:

func postLeft(_sender: AnyObject?)

    println("go to secound view..")
    let secondViewController = PostCreateController()

    self.navigationController?.setViewControllers([secondViewController], animated: true)

希望这对您有所帮助!

【讨论】:

谢谢,我试过了,但没有任何反应.. :( secoundViewController 没有出现.. :( 你检查了self.navigationController 是零吗? println(self.navigationController) = 可选() self.window!.rootViewController = self.mainNavigationController println(self.navigationController) println(self.view.window!.rootViewController) 可选的() 可选的() 所以他们不等于跨度>

以上是关于在两个 viewController 之间导航的主要内容,如果未能解决你的问题,请参考以下文章

导航栏和 ViewControllers 视图之间的 NSLayoutConstraint

两个视图控制器之间的 Segue

导航控制器之间的自定义转换

iOS:视图控制器之间的导航

从 UITableView 导航到另一个 ViewController 然后返回到 TableViewController 会导致一些元素消失

视图控制器之间的导航问题