我正在努力寻找一个好的解决方法来解决这个问题。在视图控制器的-viewWillDisappear:
方法中,我需要找到一种方式来确定是因为视图控制器被推到导航控制器的堆栈上,还是因为视图控制器消失了,因为它已经被弹出。
目前,我正在设置标志,例如isShowingChildViewController
,但它变得相当复杂。我认为唯一可以检测它的方法是在-dealloc
方法中。
我正在努力寻找一个好的解决方法来解决这个问题。在视图控制器的-viewWillDisappear:
方法中,我需要找到一种方式来确定是因为视图控制器被推到导航控制器的堆栈上,还是因为视图控制器消失了,因为它已经被弹出。
目前,我正在设置标志,例如isShowingChildViewController
,但它变得相当复杂。我认为唯一可以检测它的方法是在-dealloc
方法中。
在iOS 6+中,转场可以是处理这个问题的一种非常有效的方式。如果您在Interface Builder中为特定的转场指定了标识符,您可以在prepareForSegue
中检查它。
- (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
}
}
这里有一个类别可以完成与sbrocket答案相同的事情:
标题:
#import <UIKit/UIKit.h>
@interface UIViewController (isBeingPopped)
- (BOOL) isBeingPopped;
@end
源代码:
#import "UIViewController+isBeingPopped.h"
@implementation UIViewController (isBeingPopped)
- (BOOL) isBeingPopped {
NSArray *viewControllers = self.navigationController.viewControllers;
if (viewControllers.count > 1 && [viewControllers objectAtIndex:viewControllers.count-2] == self) {
return NO;
} else if ([viewControllers indexOfObject:self] == NSNotFound) {
return YES;
}
return NO;
}
@end
我猜你是指当你说“推到堆栈上”时,你的视图被导航控制器下移动。我建议使用viewDidUnload
方法,添加一个NSLog
语句来向控制台输出一些信息,以便你可以看到发生了什么,你可能还想在viewWillDisappear
添加一个NSLog
。