我正在制作一个具有购物车功能的应用。购物车 VC 可通过导航栏上的按钮从多个 VC 访问。到目前为止,我只有一个导航 Controller ,如图所示,每个 VC 都将我带到下一个,没什么特别的。第三个 VC(指向蓝色箭头)是一个 VC,它显示产品/项目的详细信息,并允许我将其添加到购物车。
Shopping Cart VC 出现问题。要编辑项目,我想重新使用我之前使用的相同产品/项目的详细信息(指向蓝色箭头)VC。
现在,我真的没有问题,但我注意到,一旦我创建了蓝色 segue,第三个 VC 的导航栏就在 Storyboard中消失了,但是当我运行应用程序时我仍然能够看到它.
注意:
我的问题是:
如果有人需要进一步解释,请告诉我,我会编辑我的问题。
编辑:澄清一下,蓝色的 segue 基本上是购物车 VC 中 UITableView 中的一个按钮。如果您点击该按钮,它应该打开产品/项目详细信息 VC 并允许您编辑项目的颜色等。在项目详细信息 VC 中,我不会将项目作为新项目添加到购物车中,而是显示一个编辑将编辑请求发送到 API 并将 VC 返回到购物车的按钮,或者我可以使用导航 Controller 中的后退按钮返回到购物车。
EDIT2beshio
感谢您的回答。然而 VC1 实际上是我所有应用程序启动的根 VC。我不明白为什么要从导航 Controller 的堆栈中删除 VC。我希望后退按钮按预期工作。
到目前为止,我已经实现了我想要的,但我担心让两个 VC 相互竞争会导致问题。我已经禁用了 VC3 中的购物车按钮,以防 VC3 从购物车中出现,这样可以防止循环。我只担心以后会出现内存泄漏。
有可能实现这种过渡。
在这里,我将描述如何使用您的图表来实现这一点。 如您的图表所示,假设您有 VC1、VC2、VC3(从上到下)和 VCX(带蓝色框)。您需要定义过渡和相关的动画方向(推:从右到左或弹出:从左到右)。作为您的图表,如果您将过渡和动画定义为:
并假设我们已经实例化了所有 View Controller ,那么,
在 VC1:
navigationController!.pushViewController(VC2, animated: true)
在 VC2:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
// remove VC1 from navigation stack (I assume VC1 is not a root VC)
let allControllers = NSMutableArray(array: navigationController!.viewControllers)
allControllers.removeObject(at: allControllers.count - 2)
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
}
在 VC1:
navigationController!.pushViewController(VCX, animated: true)
在 VCXA)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let allControllers = NSMutableArray(array: navigationController!.viewControllers)
if (navigationController!.viewControllers[allControllers.count-2] != VC3) {
// if not from VC3, remove VC from stack and put VC3
allControllers.removeObject(at: allControllers.count - 2)
allControllers.insert(VC3, at: allControllers.count - 1)
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
}
在 VC2:
navigationController!.pushViewController(VC3, animated: true)
在 VC3B)
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let allControllers = NSMutableArray(array: navigationController!.viewControllers)
if (navigationController!.viewControllers[allControllers.count-2] == VC2) {
// if from VC2, remove it
allControllers.removeObject(at: allControllers.count - 2)
navigationController!.setViewControllers(allControllers as [AnyObject] as! [UIViewController], animated: false)
}
}
在 VC2:
navigationController!.pushViewController(VCX, animated: true)
在 VCX:与 (A) 相同
在 VCX:
navigationController!.popViewController(animated: true)
在 VC3:与 (B) 相同
注意 viewDidAppear 在用户滑动(从左到右)返回并在途中取消(== 向左滑动)时调用。因此,针对这种情况,您需要在 viewDidAppear 中添加一些小代码。
如果你想要不同的动画方向,通过操作堆栈和使用push/pop,你可以很容易地实现它。 This解释如何。
关于ios - 导航 Controller 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47273506/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |