所以我有一个iPhone应用程序,它利用UINavigationController来设置视图。当应用程序首次启动时,它会向用户显示一个UITableViewController,用户可以选择一个项目,它将推送另一个视图。现在我设置它,以便我的应用程序记住用户的最后选择并自动选择它并加载正确的视图控制器。唯一的问题是,当我自动加载下一个视图时,我遇到了一个非常奇怪的故障..
按下视图时,导航工具栏将更改,以便显示指向上一个视图的后退按钮,但不会显示下一个视图。它将继续显示表视图,我也可以与它进行交互。我可以按后退按钮,它会将工具栏改回,桌面视图仍会显示。然后,当我选择一个项目时,它就可以正常加载视图。
感谢您的帮助。
代码:
我根据它是否可以连接到服务器来确定是否推送视图控制器。我在一个背景线程中这样做:
- (void)startingThread
{
[NSThread detachNewThreadSelector:@selector(loginThread:) toTarget:self withObject:communicator];
}
- (void)loginThread:(MowerCommunicator *)communicator
{
//If it can connect, launch thread complete.
[self performSelectorOnMainThread:@selector(loginThreadComplete:) withObject:communicator waitUntilDone:NO];
}
- (void)loginThreadComplete:(MowerCommunicator *)communicator
{
//push view controller
}
现在我添加了NSLog语句来跟踪视图是否实际“显示”并且调用了viewWillAppear和viewDidAppear。我还检查导航控制器的委托方法,并调用它们。
我有一个视图,它是初始启动视图,它从服务器读取以确定在下一个表视图中显示的内容。这被推得很好,当桌面视图被推动时,我隐藏了后退按钮,因此用户无法在不关闭应用程序的情况下返回到第一个视图。然后tableview查看NSUserDefaults中的变量,以确定是否存在已保存的索引,然后按下下一个视图控制器。那是故障发生的时候。如果我然后按后退按钮“返回”到表视图(这实际上只是更改导航工具栏),然后我从表视图中选择一个项目,它正确加载下一个视图。此外,当用户从表格视图中按下某个项目以及应用程序自动加载视图时,我会调用完全相同的方法。
答案 0 :(得分:0)
最简单的解释是你将初始tableviewcontroller推到导航控制器的堆栈上两次。
如果您将初始tableviewcontroller设置为nib中nav的第一个控制器,但是当您尝试自动显示堆叠视图时将同一个控制器推入堆栈,您将获得所描述的内容。导航从nib开始使用控制器,然后在其上推送另一个实例。
您应该在执行自动推送之前和之后记录导航的viewControllers
属性,以查看堆栈的实际状态。