确定viewcontroller是否已经在堆栈中,如果是,请转到或关闭它

时间:2013-02-13 14:50:13

标签: objective-c xcode

我有一个我正在处理的应用程序,它有一个带有两个按钮的主屏幕。一个将带您到GPS(地图)的视图,然后一旦(新的VC)它可以选择设置该位置或提出已标记的所有位置的列表(tableview,另一个VC)。

在VC列表中,如果单击表格单元格,它将显示带有地图的VC。问题是,这会在堆栈上添加相同的VC bak。如果用户点击取消按钮,他们返回一个屏幕,然后取消返回另一个屏幕等...直到回到主屏幕。

我知道我可以做[self.navigationController popToRootViewControllerAnimated:YES];弹回root,但这并不总是我想要的。

另外,我知道我可以这样做:[[[present presentsViewController] presentsViewController] dismissModalViewControllerAnimated:YES];

我想我所说的是我想“重用”GPS地图视图,所以我可以从其他VC调用它,这就是为什么我没有用“回传”来调用VC。那么,当按下按钮并且要呈现新的VC时,是否可以在显示新的VC之后解除之前的那个?这样,解除当前的VC就会把我带回到我需要的地方。

我希望有道理,而且这个问题不属于“非实际问题”类别。

非常感谢任何帮助或更好的建议。 THX

...地理位置

2 个答案:

答案 0 :(得分:1)

如果要在导航控制器的VC堆栈中跳回一些级别,您可能希望使用其popToViewController:animated:方法。要确定特定视图控制器是否在该堆栈上,请查看导航控制器的viewControllers属性。但要小心,因为这种跳跃是一种相当不规范的UI行为(即使有它的API),这可能会使用户感到困惑。

此外,使用导航控制器并呈现模态并不是管理多个视图控制器的唯一方法 - 您始终可以自己设置窗口rootViewController(并使用UIView动画设置动画更改动画),如果您愿意,甚至可以在自定义UIStoryboardSegue中包装自定义转换类型。

答案 1 :(得分:0)

您可以在表格视图中放置委托。因此,当按下单元格时,信息将传递给VC中的委托方法,该方法将关闭表视图并使用新信息重新加载自身。您必须在该VC中实现刷新方法。