可能重复:
iphone - “Pushing the same view controller instance more than once is not supported” exception
我正在从1推送test2ViewController,如下所示,
self.controller2 = [[test2ViewController alloc] initWithNibName:@"test2ViewController" bundle:nil anUser:self.idUser];
[[self navigationController] pushViewController:self.controller2 animated:NO];
[self.controller2 release];
从2到1我再次初始化1之后弹出它(必须初始化)。
self.controller1 = [[test1ViewController alloc] initWithNibName:@"test1ViewController" bundle:nil anUser:self.idUser];
[[self navigationController] popToRootViewControllerAnimated:NO];
[self.controller1 release];
当尝试再次从1推送2时,和问题出现,应用程序因错误而崩溃,
Pushing the same view controller instance more than once is not supported
出错了什么?谢谢。
答案 0 :(得分:1)
首先,您要创建另一个test2ViewController实例,这样每次更改视图时都会转到另一个实例。
你应该做什么:
if(!test2ViewController)
secondView = [[test2ViewController alloc] init...];
[self navigationController pushViewController:secondView animated:NO];
并返回,简单地说:
[self.navigationController popViewControllerAnimated:NO];
PoppingtoRoot会让你弹出到第一个使用pushViewController方法的视图控制器。
答案 1 :(得分:0)
根据您发布的代码判断,您只需将一个视图控制器(controller2)推送到导航控制器。
popToRootViewControllerAnimated:
将从堆栈中删除所有视图控制器,除了根视图控制器(在您的情况下似乎是controller2)。所以基本上什么也没做。
然后你尝试再次推送相同的视图controller2并且它失败了,因为正如错误消息所说,这是不允许的。
答案 2 :(得分:0)
您无需再次重新初始化viewController1;如果你从1推动viewController2,那么你只需要调用
[self.navigationController popToRootViewControllerAnimated:NO];
因为viewController1已经在堆栈中。这个方法的作用是删除堆栈上除第一个以外的所有viewControllers并返回到它。
如果viewController1不是rootView控制器,则应使用
[self.navigationController popViewControllerAnimated:NO];
它将仅弹出堆栈中最后一个推送的viewcontroller并显示其下方的那个。