在两个 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
设置为rootViewController
的rootViewController
动画:
func postLeft(_sender: AnyObject?)
println("go to secound view..")
let secondViewController = PostCreateController()
self.navigationController?.setViewControllers([secondViewController], animated: true)
希望这对您有所帮助!
【讨论】:
谢谢,我试过了,但没有任何反应.. :( secoundViewController 没有出现.. :( 你检查了self.navigationController
是零吗?
println(self.navigationController) = 可选(以上是关于在两个 viewController 之间导航的主要内容,如果未能解决你的问题,请参考以下文章
导航栏和 ViewControllers 视图之间的 NSLayoutConstraint
从 UITableView 导航到另一个 ViewController 然后返回到 TableViewController 会导致一些元素消失