viewwillappear方法 super有什么用

自定义UINavigationController出现-(void)viewWillAppear:(BOOL)animated不能调用问题解决
将UINavigationController的view作为subview添加到了其他viewController的view中。
或者把UINavigationController添加到UITabbarController中了。
此时,NavigationController的stack里面的viewController就收不到-(void)viewWillAppear:(BOOL)animated;等4个方法的调用。
原因还不敢确定,应该是这样的结构破坏了消息的响应链。导航控制器上层的viewController只是接受了导航控制器的view,而不是controller.
估计tabbarController内部也是处理了set进去的controller的view。
解决方法两种:
1,在导航控制器上层controller的viewWillAppear中显式调用viewWillAppear方法。
-(void)viewWillAppear:(BOOL)animated
&&&&[super
viewWillAppear:animated];
&&&&[selectedViewController
viewWillAppear:animated];&&//tabbarController直接用selectedViewController更方便
2,把导航控制器上层controller设为UINavigationController的delegate,在
-(void)navigationController:(UINavigationController
*)navigationController willShowViewController:(UIViewController
*)viewController animated:(BOOL)animated
;中显示调用viewWillAppear。
-(void)navigationController:(UINavigationController
*)navigationController willShowViewController:(UIViewController
*)viewController animated:(BOOL)animated
&&&&[viewController
viewWillAppear:animated];
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。arthurchen 的BLOG
用户名:arthurchen
文章数:108
评论数:237
访问量:254194
注册日期:
阅读量:5863
阅读量:12276
阅读量:335733
阅读量:1039985
51CTO推荐博文
你可曾遇到过viewWillAppear没有被调用到的情况
产生原因是用了UINavigationController.&
将UINavigationController的view作为subview添加到了其他viewController的view中。
或者把UINavigationController添加到UITabbarController中了。
此时,NavigationController的stack里面的viewController就收不到-(void)viewWillAppear:(BOOL)animated;等4个方法的调用。
Apple Docs state:
Warning: If the view belonging to a view controller is added to a view hierarchy directly, the view controller will not receive this message. If you insert or add a view to the view hierarchy, and it has a view controller, you should send the associated view controller this message directly. Failing to send the view controller this message will prevent any associated animation from being displayed.
不过后面的到4.0的文档就没有发现这样的文字描述了,但是还是没能够调用的到这样
只是添加的更复杂的文档,头晕晕看不下去了。
解决方法两种:
1,在导航控制器上层controller的viewWillAppear中显式调用viewWillAppear方法。
-(void)viewWillAppear:(BOOL)animated
[super viewWillAppear:animated]; [subNavCntlr viewWillAppear:animated];
- (void)viewWillDisappear:(BOOL)animated
[super viewWillDisappear:animated];
[subNavCntlr viewWillDisappear:animated];
2,把导航控制器上层controller设为UINavigationController的delegate
nav.delegate =
@interface RootViewController : UIViewController &UINavigationControllerDelegate& { UINavigationController *navC }
- (void )navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL )animated { [viewController viewWillAppear:animated]; } - (void )navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL )animated { [viewController viewDidAppear:animated]; }
凑合着用吧,我喜欢第二种,不过我更喜欢干脆不再viewWillappear里做事情了。本文出自 “” 博客,请务必保留此出处
了这篇文章
类别:┆阅读(0)┆评论(0)viewWillDisappear,viewWillAppear不调用的解决方法(转)
产生原因是用了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&=&&&
&&&&secondViewController.delegate&=&&&
&&&&thirdViewController.delegate&=&&&
&&&&fourthViewController.delegate&=&&&
&&&&fifthViewController.delegate&=&&&
&&&&NSArray&*viewControllerArray&=&[NSArray&arrayWithObjects:firstViewController,secondViewController,thirdViewController,fourthViewController,fifthViewController,nil];&&&
&&&&self.viewControllers&=&viewControllerA&&
&&&&[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&=&&&
&&&&//若上个view不为空&&
&&&&if&(lastController&!=&nil)&&&
&&&&&&&&//若该实例实现了viewWillDisappear方法,则调用&&
&&&&&&&&if&([lastController&respondsToSelector:@selector(viewWillDisappear:)])&&&
&&&&&&&&{&&
&&&&&&&&&&&&[lastController&viewWillDisappear:animated];&&
&&&&&&&&}&&
&&&&//将当前要显示的view设置为lastController,在下次view切换调用本方法时,会执行viewWillDisappear&&
&&&&lastController&=&viewC&&
&&&&[viewController&viewWillAppear:animated];&&
这个方法是重点&
static&UIViewController&*lastController&=&&&
静态变量只在程序初始化的时候执行一次,也就是赋值为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&=&viewC&&
&[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)&
方法就行了&
/blog/1433313
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。【iOS知识学习】_视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear等的区别及用途 - 博客频道 - CSDN.NET
weasleyqi的专栏
Just do what I want to do。
iOS视图控制对象生命周期-init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的区别及用途
init-初始化程序
viewDidLoad-加载视图
viewWillAppear-UIViewController对象的视图即将加入窗口时调用;
viewDidApper-UIViewController对象的视图已经加入到窗口时调用;
viewWillDisappear-UIViewController对象的视图即将消失、被覆盖或是隐藏时调用;
viewDidDisappear-UIViewController对象的视图已经消失、被覆盖或是隐藏时调用;
viewVillUnload-当内存过低时,需要释放一些不需要使用的视图时,即将释放时调用;
viewDidUnload-当内存过低,释放一些不需要的视图时调用。
&&&&&&& 视图控制对象通过alloc和init来创建,但是视图控制对象不会在创建的那一刻就马上创建相应的视图,而是等到需要使用的时候才通过调用loadView来创建,这样的做法能提高内存的使用率。比如,当某个标签有很多UIViewController对象,那么对于任何一个UIViewController对象的视图,只有相应的标签被选中时才会被创建出来。
比如如下代码:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
UITabBarItem *tbi = [self tabBarItem];
[tbi setTitle:@&CurrentTime&];
[[self view ] setBackgroundColor:[UIColor yellowColor]];
我们将UIViewController的init方法中访问的实例变量view在init中将背景设置为黄色,运行程序,我们能发现背景的确变成了黄色,但是,在我们还没有需要使用视图的时候,该视图已经加载好了,在UIViewController的初始方法中访问实例变量view,会导致延迟载入机制失效,这个问题看上去不是很严重,但是如果考虑到内存过低警告,那么问题就大了。。。
运行程序,选择模拟器中的硬件-&模拟内存过低警告,我们会发现,原本设置的黄色背景不见了,这是因为,内存过低,视图控制对象会在发出内存过低警告时收到didReceiveMemoryWarning消息,该方法默认实现,检查视图控制对象的视图是否可见,如果不可见,则释放掉,下次在加载该视图时就不会执行init方法,而是只执行viewDidLoad方法,所以需要将[[selfview
] setBackgroundColor:[UIColoryellowColor]];放到viewDidLoad中,这样如果视图因为内存过低被释放掉了,下次需要使用到该视图的时候,程序会默认取执行该视图的viewDidLoad方法,这样背景颜色就又出来了。
init、viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear、viewDidDisappear的执行顺序:
&从程序的log来看:
15:51:44.811inHyron[483:b903] init
15:51:54.081inHyron[483:b903] viewDidLoad
15:51:54.082inHyron[483:b903] viewVillAppear
15:51:54.084 inHyron[483:b903] viewDidAppear
很明显,先执行init、然后执行viewDidLoad,然后是viewWillAppear最后是viewDidAppear,这样视图就创建好了,当视图消失或者被覆盖的时候:
15:54:14.557inHyron[483:b903] viewWillDisappear
15:54:14.558inHyron[483:b903] viewDidDisappear
这样一来视图就消失了,当模拟内存警告的时候:
15:55:14.333inHyron[483:b903] Received simulated memory warning.
15:55:14.334inHyron[483:b903] viewWillUnload
15:55:14.335 inHyron[483:b903]viewDidUnload
从log可以看出,当视图控制对象收到内存警告的时候,程序会执行viewWillUnload最后是执行viewDidUnload。
这样,一套的流程就完成了,不知道写的是否详细。。。。
还有看的不明白的,可以取下我的小Demo:&,在CurrentTimeViewController.m当中详细的log都写好了,大家可以取研究研究。
排名:第6438名
(31)(13)(8)(4)(8)(1)(5)(4)(1)(1)[转]loadView和viewDidLoad方法及viewWillAppear和viewDidAppear&.
一、loadView
永远不要主动调用这个函数。view
controller会在view的property被请求并且当前view值为nil时调用这个函数。如果你手动创建view,你应该重载这个函数。如果你用IB创建view并初始化view
controller,那就意味着你使用initWithNibName:bundle:方法,这时,你不应该重载loadView函数。
这个方法的默认实现是这样:先寻找有关可用的nib文件的信息,根据这个信息来加载nib文件,如果没有有关nib文件的信息,默认实现会创建一个空白的UIView对象,然后让这个对象成为controller的主view。
所以,重载这个函数时,你也应该这么做。并把子类的view赋给view属性(property)(你create的view必须是唯一的实例,并且不被其他任何controller共享),而且你重载的这个函数不应该调用super。
如果你要进行进一步初始化你的views,你应该在viewDidLoad函数中去做。在iOS
3.0以及更高版本中,你应该重载viewDidUnload函数来释放任何对view的引用或者它里面的内容(子view等等)。
这个网上的资料都说的很不全面,尤其是蓝色字部分。二、viewDidLoad
这个函数在controller加载了相关的views后被调用,而不论这些views存储在nib文件里还是在loadView函数中生成。而多数情况下是做nib文件的后续工作。
三、viewDidUnload
这个函数是viewDidLoad的对立函数。在程序内存欠缺时,这个函数被controller调用,来释放它的view以及view相关的对象。由于controller通常保存这view以及相关object的引用,所以你必须使用这个函数来放弃这些对象的所有权以便内存回收。但不要释放那些难以重建的数据。
通常controller会保存nib文件建立的views的引用,但是也可能会保存着loadView函数创建的对象的引用。最完美的方法是使用合成器方法:self.myCertainView
= nil这样合成器会release这个view,如果你没有使用property,那么你得自己显示释放这个view。
网上对这个函数的描述含含糊糊,看了等于没看。四、结论
所以流程应该是这样:
(loadView/nib文件)来加载view到内存 ——&viewDidLoad函数进一步初始化这些view
——&内存不足时,调用viewDidUnload函数释放views
—-&当需要使用view时有回到第一步
注意iphone开发中的这两个函数viewWillAppear和viewDidAppear
每当视图准备在屏幕上显示,或者视图已在屏幕上完全显示时,将调用这两个方法。
viewWillAppear:方法更新准备显示的视图的信息。调用时,视图可能还没有被加载。
使用viewDidAppear:来触发视图完全显示在屏幕上之后的行为,例如任何动画。
viewdidload是当程序第一次加载view时调用,以后都不会用到,而viewDidAppear是每当切换到view时就调用。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 viewwillappear方法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信