- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
NSArray *viewControllers = self.navigationController.viewControllers;
if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) {
// View is disappearing because a new view controller was pushed onto the stack
NSLog(@"New view controller was pushed");
} else if ([viewControllers indexOfObject:self] == NSNotFound) {
// View is disappearing because it was popped from the stack
NSLog(@"View controller was popped");
}
}
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
if (self.navigationController.viewControllers == nil) {
// It has been popped!
NSLog(@"Popped and Gone");
}
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"LoginSegue"]) {
NSLog(@"Push");
// Do something specific here, or set a BOOL indicating
// a push has occurred that will be checked later
}
}
12 回答
您可以使用以下内容 .
当然,这是可能的,因为在调用viewWillDisappear时,UINavigationController的视图控制器堆栈(通过viewControllers属性公开)已经更新 .
我认为最简单的方法是:
迅速:
来自UIViewController.h中的Apple文档:
所以是的,唯一记录的方法是通过以下方式:
Swift 3版本:
如果您只是想知道您的视图是否被弹出,我刚刚发现
self.navigationController
在viewDidDisappear
中是nil
,当它从控制器堆栈中删除时 . 所以这是一个简单的替代测试 .(这是我在尝试各种其他扭曲之后发现的 . 我没有导航控制器协议来注册视图控制器以便在弹出窗口上通知 . 你不能使用
UINavigationControllerDelegate
,因为它实际上是真正的显示工作 . )斯威夫特4
在Swift中:
我发现Apple的文档很难理解 . 此扩展程序有助于查看每个导航的状态 .
这个问题相当陈旧,但我偶然看到它,所以我想发布最佳实践(afaik)
你可以这样做
这适用于 iOS7 ,不知道它是否适用于任何其他的 . 据我所知,在
viewDidDisappear
中,视图已经被弹出 . 这意味着当您查询self.navigationController.viewControllers
时,您将获得nil
. 所以,检查一下是否为零 .TL; DR
在iOS 6中,Segues可以是一种非常有效的方法来处理这个问题 . 如果您在Interface Builder中为特定的segue指定了标识符,则可以在
prepareForSegue
中检查它 .我假设您的意思是当您说要推入堆栈时,通过推送新视图将视图移动到导航控制器的堆栈中 . 我建议使用
viewDidUnload
方法添加一个NSLog
语句来向控制台写一些东西,这样你就可以看到发生了什么,你可能想要添加NSLog
到viewWillDissappeer
.这是一个类别来完成与sbrocket的答案相同的事情:
Header:
Source: