我有一个包含 2 种主要控制器类型的应用程序:
1) UITableViewController - 充当导航屏幕 2) UIViewController 包含在 UINavigationController - 显示主要应用程序内容。
TableViewController 的内容看起来有点像这样:
- 第 1 页
- 第2页
- 第 3 页 ... 等
我在 AppDelegate 上定义了一个属性——一个名为 PageViewControllers 的数组。当应用程序启动时,会为应用程序中的每个页面创建一个新的 UIViewController 实例。
第一个Page的控制器设置为 UINavigationController 的 rootViewController。
当用户在 UITableView 控制器中选择一行时,UINavigationController 会推送或弹出该行的相关视图控制器。(如果我点击“第 3 页”,它会推送到第三页的控制器)。
我的这个运行良好 - 唯一的问题是应用程序在尝试跳回导航堆栈时偶尔会崩溃。例如,从第15 页到第2页
我收到的错误消息是:
*** Terminating app due to uncaught exception 'RuntimeError', reason: 'NSInternalInconsistencyException: Tried to pop to a view controller that doesn't exist.
我认为 UINavigationController 可能会发布一些控制器。我认为该应用程序会将所有以前的控制器保存在内存中,以允许 UINavigationController 的后退按钮按预期运行?
知道如何防止这种情况发生,还是我错过了什么?
更新
这是我在选择表格行后推送/弹出导航控制器的代码。(这是Rubymotion)
def tableView(tableView, didSelectRowAtIndexPath: indexPath)
# first we need to work out which controller was selected...
page = Page.current
currentPageController = appDelegate.pageControllers[page.absoluteIndex]
currentPageControllerIndex = appDelegate.pageControllers.index(currentPageController)
nextPageController = appDelegate.pageControllers[Page.pageAtIndexPath(indexPath).absoluteIndex]
nextPageControllerIndex = appDelegate.pageControllers.index(nextPageController)
case
# When we're moving forward in the stack...
when currentPageControllerIndex < nextPageControllerIndex
for controller in appDelegate.pageControllers[(currentPageControllerIndex + 1)..nextPageControllerIndex]
# push the next controller on to the nav stack, only animate if it's the last one
appDelegate.rootViewControllerNav.pushViewController(controller, animated: controller == nextPageController)
end
# When we're moving backward in the stack...
when currentPageControllerIndex > nextPageControllerIndex
appDelegate.rootViewControllerNav.popToViewController(nextPageController, animated: true)
# When we select the same step again...
else
NSLog("Selected the same page")
end
# close the side menu afterwards
appDelegate.rootViewControllerNav.sideMenu.toggleSideMenuPressed(self)
end