产生原因是用了UINavigationController.
将UINavigationController的view作为subview添加到了其他viewController的view中。
或者把UINavigationController添加到UITabbarController中了。
此时,NavigationController的stack里面的viewController就收不到-(void)viewWillAppear:(BOOL)animated;等4个方法的调用。
原因还不敢确定,应该是这样的结构破坏了消息的响应链。导航控制器上层的viewController只是接受了导航控制器的view,而不是controller. 估计tabbarController内部也是处理了set进去的controller的view。
网上找了一些解决办法,但是有些只解决了Appear的方法调用,没有解决DisAppear的调用,最终找到了最好的一个解决办法,完美解决了Appear和DisAppear的调用。
首先要实现一个UITabBarController的子类。并且实现UINavigationControllerDelegate
- (void)viewDidLoad
{
FirstViewController *firstViewController = [[FirstViewController alloc]init];
SecondViewController *secondViewController = [[SecondViewController alloc]init];
ThirdViewController *thirdViewController = [[ThirdViewController alloc]init];
FourthViewController *fourthViewController = [[FourthViewController alloc]init];
FifthViewController *fifthViewController = [[FifthViewController alloc]init];
firstViewController.delegate = self;
secondViewController.delegate = self;
thirdViewController.delegate = self;
fourthViewController.delegate = self;
fifthViewController.delegate = self;
NSArray *viewControllerArray = [NSArray arrayWithObjects:firstViewController,secondViewController,thirdViewController,fourthViewController,fifthViewController,nil];
self.viewControllers = viewControllerArray;
[self.view setFrame:CGRectMake(0, 0, 320, 460)];
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
以上FirstViewController到FifthViewController都是UINavigationController的子类。
将delegate指向self。
然后实现UINavigationControllerDelegate:
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
//每次当navigation中的界面切换,设为空。本次赋值只在程序初始化时执行一次
static UIViewController *lastController = nil;
//若上个view不为空
if (lastController != nil)
{
//若该实例实现了viewWillDisappear方法,则调用
if ([lastController respondsToSelector:@selector(viewWillDisappear:)])
{
[lastController viewWillDisappear:animated];
}
}
//将当前要显示的view设置为lastController,在下次view切换调用本方法时,会执行viewWillDisappear
lastController = viewController;
[viewController viewWillAppear:animated];
}
这个方法是重点
static UIViewController *lastController = nil;
静态变量只在程序初始化的时候执行一次,也就是赋值为nil。
lastController指向的是新的界面要显示却还未显示的当前界面。
举例子来说 ,如果navigation当前显示的是A,现在要push到B。因此在push B之前,lastController指向的是A
//若上个view不为空
if (lastController != nil)
{
//若该实例实现了viewWillDisappear方法,则调用
if ([lastController respondsToSelector:@selector(viewWillDisappear:)])
{
[lastController viewWillDisappear:animated];
}
}
像上边说的,lastController这时为A,因此不为nil,将执行A的viewWillDisappear。
lastController = viewController;
[viewController viewWillAppear:animated];
在执行了A的viewWillDisappear之后,将lastController设为B(当前viewController),然后调用B的viewWillAppear。
本次方法执行结束了,如果navigation再push到C的时候,那么B的viewWillDisappear会执行,C的viewWillAppear会执行。这样就完美解决了viewWillAppear等4个方法不调用的问题。
如果想实现viewDidAppear和viewDidDisAppear方法,则只需按照同样道理,实现UINavigationControllerDelegate 的
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated;
方法就行了
分享到:
相关推荐
TabBarController与... ⁃ viewWillAppear(), viewDidAppear(), viewWillDisappear(), viewDidDisappear()等方法不被调用的解决方法(解释在这里) Coding Style: Daniel's Objective-C Coding Style Guidelines
可以滑动查看, 各个ViewController的 viewDidLoad , viewWillAppear, viewDidAppear,viewWillDisAppear, viewDidDisappear都会正确的执行(翻页到对应的ViewController时才会调用viewDidLoad, viewWillAppear,...
View支持延迟加载和响应viewWillAppear,viewWillDisappear等方法。 在顶部栏的文本中添加对自定义动画的支持。 v1.4.1-06.02.2015: 为selectedIndex添加KVO v1.4.0-06.01.2015: 定制更多。 v1.3.0-04.15.2015: ...
此示例代码增强了 UIViewController 并将日志记录功能添加到 viewWillAppear: viewDidAppear: viewWillDisappear: 和 viewDidDisappear 方法。 但是你可以在任何需要注入功能的地方使用它。 适用于来自iOS
声明一个 MLInfiniteScrollView成员变量(我推荐您这么做, 因为您需要在 ViewWillDisAppear 方法中调用 MLInfiniteScrollView 实例的 startAutoScroll 方法来停止滚动, 否则由于定时器的存在, 将会无法释放.) 和 ...
viewWillAppear中实现 showbigImage=[[ShowBigImageBox alloc]init]; [showbigImage setShowBigImageBoxDelegate:self]; viewWillDisappear中实现:[showbigImage clearBigImageBox];//在页面结束的时候清楚图片...
- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; //开启视图跟随键盘移动效果 [self.view openFollowKeyboard]; } - (void)viewWillDisappear:(BOOL)animated { [super ...
4. 核心步骤:1、viewWillAppear设置横屏2、viewWillDisappear 设置竖屏 用法简单采用block回调电子签名图片 5. 包含坐标获取演示代码:...
IOS NSNotification 键盘遮挡问题的解决办法 从键盘通知中获得键盘尺寸 键盘尺寸存在于NSNotification中。 1;在AddDrinkViewController中添加keyboardDidShow和keyboardDidHide方法 2;在viewWillAppear中注册...
实现页面的统计需要在每个UIViewController中配对调用如下方法: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [MobClick beginLogPageView:@PageOne];//(PageOne为页面名称,可...
UIViewController生命周期挂钩: viewDidLoad viewWillAppear viewDidAppear viewWillDisappear viewDidDisappear UIView生命周期挂钩: didMoveToWindow 注意:操作是在对象自己执行相应方法之后执行的,但...
一、当A页面要push到B页面,需要将B页面的导航栏隐藏时,我们只需要在A页面中重写以下两个方法: override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.navigationController?....
示例代码:- (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; RACDisposable *disposable = [[[[self.client fetchUserRepositories] collect] deliverOn:RACScheduler....
IOS 中NSTimer定时器的使用 NSTimery 定时器,主要用于进行定时执行指定方法,常用场景如:获取验证码的按钮倒计时;图片轮播定时。 1 使用注意事项: ... (BOOL)animated “中(注意:不能在方法” – (void)d
ZSSUserDefaults 当需要为多个用户保存默认值时, ZSSUserDefaults可以替代NSUserDefaults 。 通过为每个用户编写一个.plist... 通常在viewWillDisappear:方法中: - ( void )viewWillDisappear:( BOOL )animated {
RxViewController UIViewController和NSViewController的RxSwift包装器。 乍看上去 ... var viewWillAppear: ControlEvent var viewDidAppear: ControlEvent var viewWillDisappear: ControlEvent var
4. (OPTIONAL) 如果不想在 JXRollView 所在页面出现闪滚(从子页面返回 或 从后台切换到前台), 即 JXRollView 所在页每次出现都重新滚动(非从第一张), 则在: 1. 在 JXRollView 所在页面的 viewDidAppear 和 ...
使用方法: iPerspective支持CocoaPods: pod iPerspective 首先 #import 设定motionmanager: - (CMMotionManager *)sharedManager { static dispatch_once_t onceToken; dispatch_once(&onceToken;, ^{ ...
JHNavigationBar ##截屏 ##用法 override func viewDidLoad() { ... override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(animated) // case2: // self.navigati