Re: [问题] dismissViewController

楼主: DLMC (永保安康)   2014-02-26 21:50:26
※ 引述《y03131003 (Jimmy)》之铭言:
: 我有A, B, C, D 四个viewController
: A 是 rootViewController(TabBarViewController)
: B 是 用AVFoundation写的相机
: A 用 modal 的方式叫出了 B
: B 用 modal 的方式叫出了 C
: C 用 modal 的方式叫出了 D
: 我想在D里按一个按钮回到A
: 一开始是在storyboard里直接拉一个segue到A
: 然后performSegueWithIdentifier
: 不过这样似乎有memory leak的问题,多重复几次这个步骤内存就直线上升
: 最后导致当机
: 后来查了一下发现要回到 A 只要在 D里取得rootViewController
: 然后rootViewController呼叫 dismissViewController 就行了
: 如下
: [[[[UIApplication sharedApplication] keyWindow] rootViewController]
: dismissViewControllerAnimated:NO completion:nil];
: 这样的确可以成功,可是按下按钮后大概要等2秒才会回到A..
: 请问有办法按下的瞬间就回到A吗?
: 用performSegue的方法可以瞬间,但是多重复几次就当机了...
前三次用 modal 的方式叫 view controller 出来,阶层是:
A > B(相机) > C > D
接下来在 D 用了 performSegueWithIdentifier:sender: 这个方法叫了 A,
并不是一路从 D 回到 A,
反而是 A > B(相机) > C > D > A
所以只要多跑几次,当然会挂掉(尤其 B 是相机)。
参考 UIViewController 的官方文件,http://bit.ly/1iu7EOn
在 dismissViewControllerAnimated:completion: 有提到:
If you present several view controllers in succession, thus building a stack
of presented view controllers, calling this method on a view controller lower
in the stack dismisses its immediate child view controller and all view
controllers above that child on the stack.
你用的方法正是文件中所提,只是要确保你找到的 rootViewController 就是A。
(如果D被用在别处,那这个 rootViewController 或许就不是A了)
有一个绕路的方法,干脆将它们的嵌在 naivgation controller 里面,
然后将 navigation bar 重头到尾都藏起来(如果你不想要它的话)。
如此一来,想回到最前面,只要使用 self.navigationController 的
popToRootViewControllerAnimated: 方法就好。
补充:po完文后想了一下,用 navigation controller 的话,转换 view controller 的
动画效果可能就不是原po想要的,需要自订转场动画了
另外,就如推文的网友们所提,B这个用到相机的 view controller 相当吃资源,
可以的话,用完就先关掉会比较好。
作者: y03131003 (Jimmy)   2014-02-27 00:51:00
我试试看用navigation 谢谢!!

Links booklink

Contact Us: admin [ a t ] ucptt.com