检查,如果一个UIViewController是关于得到出自一个导航堆?
-
22-07-2019 - |
题
我需要知道当我看来控制器是得到出自一个星导航叠,所以我可以执行的行动。
我不能用-viewWillDisappear,因为这被称为当的图控制器被移动的屏幕由于任何原因(如新视图控制器被推上)。
我特别需要知道当的控制器即将出现的本身。
任何想法,将是可怕的,在此先感谢。
解决方案
我不认为有这个明确的消息,但你可以子类的UINavigationController和覆盖 - popViewControllerAnimated(虽然我还没有自己尝试过这一点)
另外,如果有到视图控制器的任何其他引用,你能不能添加到其 - 的dealloc
其他提示
覆盖在所呈现的VC的viewWillDisappear
方法,接着检查重写内isMovingFromParentViewController
标志并做具体的逻辑。就我而言,我躲在导航控制器工具栏。仍需要您呈现VC明白,它被推倒,但这样并不完美。
试试重写 willMoveToParentViewController:
(而不是的 viewWillDisappear:
)在您的定义类的 UIViewController
.
所谓的前景控制器添加或删除一个容器图控制器。
- (void)willMoveToParentViewController:(UIViewController *)parent
{
[super willMoveToParentViewController:parent];
if (!parent) {
// `self` is about to get popped.
}
}
幸运的是,在viewWillDisappear方法被调用时,的viewController已经从堆栈中移除,所以我们知道的viewController被弹出,因为它是在 self.navigationController.viewControllers <不再/ p>
<强>夫特4 强>
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
if let nav = self.navigationController {
let isPopping = !nav.viewControllers.contains(self)
if isPopping {
// popping off nav
} else {
// on nav, not popping off (pushing past, being presented over, etc.)
}
} else {
// not on nav at all
}
}
<强>原始代码强>
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
if ((self.navigationController) &&
(![self.navigationController.viewControllers containsObject:self])) {
NSLog(@"I've been popped!");
}
}
这是为我工作。
- (void)viewDidDisappear:(BOOL)animated
{
if (self.parentViewController == nil) {
NSLog(@"viewDidDisappear doesn't have parent so it's been popped");
//release stuff here
} else {
NSLog(@"PersonViewController view just hidden");
}
}
您可以在这里抓住它。
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if (viewController == YourAboutToAppearController) {
// do something
}
}
这将只在新视图的显示之前进行发射。没有人还没有移动。我用所有的时间做魔术的愚蠢NavigationController的前面。您可以设置标题和按钮标题和为所欲为那里。
我有同样的问题。我试着用viewDisDisappear,但我不具备的功能得到所谓:((不知道为什么,也许是因为我所有的VC是的UITableViewController)。 亚历克斯的建议,工作正常,但如果您的导航控制器的更多选项卡下显示失败。在这种情况下,你的导航控制器的所有VC都为UIMoreNavigationController,而不是导航控制器你有子类的navigationController,这样你就不会被当VC即将杀出的导航通知。结果 Finaly,我解决了这个问题用的UINavigationController的类别,只重写 - (的UIViewController *)popViewControllerAnimated:(BOOL)动画
- (UIViewController *)popViewControllerAnimated:(BOOL)animated{
NSLog(@"UINavigationController(Magic)");
UIViewController *vc = self.topViewController;
if ([vc respondsToSelector:@selector(viewControllerWillBePopped)]) {
[vc performSelector:@selector(viewControllerWillBePopped)];
}
NSArray *vcs = self.viewControllers;
UIViewController *vcc = [vcs objectAtIndex:[vcs count] - 2];
[self popToViewController:vcc animated:YES];
return vcc;}
这很适合我:d
我尝试这样:
- (void) viewWillDisappear:(BOOL)animated {
// If we are disappearing because we were removed from navigation stack
if (self.navigationController == nil) {
// YOUR CODE HERE
}
[super viewWillDisappear:animated];
}
的想法是,在弹出时,视图控制器的navigationController被设置为零。 因此,如果观点是消失,它不再有一个navigationController,我断定它弹出。 (可能在其他情况下工作)。
无法担保该viewWillDisappear将在弹出被调用,因为它不是在文档中提到。我尝试了当视图是俯视图,下面顶视图 - 和它在这两个工作
好运, 奥德。
可以使用这一个:
if(self.isMovingToParentViewController)
{
NSLog(@"Pushed");
}
else
{
NSLog(@"Popped");
}
子类UINavigationController
和倍率popViewController
:
夫特3
protocol CanPreventPopProtocol {
func shouldBePopped() -> Bool
}
class MyNavigationController: UINavigationController {
override func popViewController(animated: Bool) -> UIViewController? {
let viewController = self.topViewController
if let canPreventPop = viewController as? CanPreventPopProtocol {
if !canPreventPop.shouldBePopped() {
return nil
}
}
return super.popViewController(animated: animated)
}
//important to prevent UI thread from freezing
//
//if popViewController is called by gesture recognizer and prevented by returning nil
//UI will freeze after calling super.popViewController
//so that, in order to solve the problem we should not return nil from popViewController
//we interrupt the call made by gesture recognizer to popViewController through
//returning false on gestureRecognizerShouldBegin
//
//tested on iOS 9.3.2 not others
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
let viewController = self.topViewController
if let canPreventPop = viewController as? CanPreventPopProtocol {
if !canPreventPop.shouldBePopped() {
return false
}
}
return true
}
}
也许可以使用UINavigationBarDelegate的的导航栏:shouldPopItem协议方法
。尝试使该检查在viewwilldisappear 如果([self.navigationController.viewControllers indexOfObject:自] == NSNotFound){ //这个观点已经爆裂happend。 }