viewwillappear的用法 super有什么用

今天也遇到了这样的问题。产生原因是用了UINavigationController.&将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)中显示调用viewWillAppear。-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{&&&&[viewController viewWillAppear:animated];}
阅读(...) 评论() &ViewController
ViewController是IOS开发中MVC模式中的C,ViewController是view的controller,ViewController的职责主要包括管理内部各个view的加载显示和卸载,同时负责与其他ViewController的通信和协调。
在IOS中,有两类ViewController,一类是显示内容的,比如UIViewController、UITableViewController等,同时还可以自定义继承自UIViewController的ViewController;另一类是ViewController容器,UINavigationViewController和UITabBarController等,UINavigationController是以Stack的形式来存储和管理ViewController,UITabBarController是以Array的形式来管理ViewController。
View的加载
可以看到,在Controller中创建View有2种方法,一种是使用Storyboard等可视化工具,另一种是通过代码创建。可视化创建在工程中很少用到,因为它满足不了开发者如饥似渴的需求--。
代码创建界面文件
1.创建新的Empty Application Project
2.新建ViewController的类,添加loadView方法,及viewDidLoad等方法
XYZViewController.m
ViewLifeCycle
Created by Norcy on 14-7-28.
Copyright (c) 2014年 QQLive. All rights reserved.
#import "XYZViewController.h"
@interface XYZViewController ()
@implementation XYZViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
- (void)loadView
UIView *contentView = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
contentView.backgroundColor = [UIColor blueColor];
self.view = contentV
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"View Did Load");
- (void)viewWillAppear:(BOOL)animated
NSLog(@"View Will Appear");
- (void)viewDidAppear:(BOOL)animated
NSLog(@"View Did Appear");
- (void)viewWillDisappear:(BOOL)animated
NSLog(@"View Will Disappear");
- (void)viewDidDisappear:(BOOL)animated
NSLog(@"View Did Disappear");
3.在AppDelegate.m中的application:didFinishLaunchingWithOptions:中注册ViewController
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
XYZViewController *viewController = [[XYZViewController alloc]initWithNibName:nil bundle:nil];
self.window.rootViewController = viewC
[self.window makeKeyAndVisible];
return YES;
虽然我们可以在AppDelegate.m中的application:didFinishLaunchingWithOptions:中设置window的代码后面添加view,但是在一般的工程中,我们不会在委托类中管理我们的View。 而是利用委托类中的UIWindow去添加UIViewController,再在ViewController类中去管理View。
附,创建带NavigationController的代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.backgroundColor = [UIColor whiteColor];
/*设置Navigation controller*/
XYZFirstViewController *viewController = [[XYZFirstViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:viewController];
[nav setNavigationBarHidden:YES animated:NO];
self.window.rootViewController =
[self.window makeKeyAndVisible];
[viewController release];
[nav release];
return YES;
ViewController生命周期
alloc -& initWithNibName -& loadView -& viewDidLoad -& viewWillAppear -& viewDidAppear -& viewWillDisappear -& viewDidDisappear -& dealloc
注意viewWillUnload和viewDidUnload已经在ios6被废弃了,因为Clearing references to views is no longer necessary。
注意1.没有viewWillLoad。
注意2.viewDidLoad和viewDidUnload并不是成对的。
17:43:36.124 ViewLifeCycle[4007:a0b] View Did Load 17:43:36.125 ViewLifeCycle[4007:a0b] View Will Appear 17:43:36.128 ViewLifeCycle[4007:a0b] View Did Appear
按下Home键,并没有任何记录
双击Home键,删除该程序 17:43:51.327 ViewLifeCycle[4007:a0b] View Will Disappear 17:43:51.327 ViewLifeCycle[4007:a0b] View Did Disappear
为什么按下Home键之后没有调用viewWillDisappear和viewDidDisappear呢?
因为在ios4后引入了后台的概念,当按下Home键之后,程序被挂起了,但是该View依然是原来的View,并不是新的。所以只有内存不够的时候或程序被终止的时候,才会调用viewWillDisappear和viewDidDisappear。
View的卸载
loadView v.s. viewDidLoad
view的nib文件为nil时,手工创建视图界面时调用loadView;当view的nib文件存在的时候,初始化工作在viewDidLoad中实现。
loadView时view还没有生成,viewDidLoad时,view已经生成了。loadView方法用来创建一个新的view。loadView只会被调用一次,而viewDidLoad可能会被调用多次。
当受到内存警告时,那么此时系统默认操作会检查当前视图控制器的view是否还在使用,如果没在使用且控制器实现了loadView方法,ViewController会将view release并将其指向为nil。
注意,不要在loadView中调用父类方法[super loadView],因为这会影响CPU性能。
注意2,切换前后台不会调用viewWillAppear
阅读(...) 评论()本周问答荣誉榜
本月问答荣誉榜
含有标签"viewWillAppear"的问题
我用了storyboard,其中的navigationcontroller有两个viewcontroller, A 和 B。A 的viewwillappear里面执行[self performSegueWithIdentifier:@"xx" sender: self];
来跳转到viewcontroller B。跳转过程中还是会先显示A,然后才跳转到B。
请问,viewwillappear是在视图显示前执行的,为何不会直接跳转到B,还要先显示A?
还有,如何能够实现从A跳转到B而中间不出现A?
我的代码是这样的:
-(void)viewWillAppear:(BOOL)animated
& & [super viewDidAppear:animated];
& & [self reloadcollectionData];
- (void)viewDidLoad
& & [super viewDidLoad];
& & [self reloadcollectionData];
- (IBAction)ClearAllWishes:(id)sender {
& & [wishList removeObjectForKey:@\"Names\"];
& & [wishList removeObjectForKey:@\"Images\"];
& & [wishList synchronize];
& & [self viewWillAppear:YES];
-(void)reloadcollectionData
& & [self WishingCollectionView].delegate =
& & [self WishingCollectionView].dataSource=
& & wishList=[NSUserDefaults standardUserDefaults];
& & Names=[wishList arrayForKey:@\"Names\"];
& &&Images=[wishList array...
我在程序中定义了多个视图,视图直接切换的时候会调用viewWillAppear方法,但是我在某个视图(例如b界面)用home键退出应用程序,再进入时不调用b界面的viewWillAppear方法,这是为什么呢?
不是每次即将进入界面时都会调用viewWillAppear方法吗?
怎么才能让每次即将进入界面时都调用viewWillAppear方法?
在doc里面的viewWillAppear看到Note:&If a view controller is presented by a view controller inside of a popover, this method is not invoked on the presenting view controller after the presented controller is dismissed.
AppDelegate:
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.navController = [[UINavigationController alloc]initWithRootViewController:self.viewController];
self.window.rootViewController = self.navC
ViewController:有个push button
- (IBAction)pushViewController:(id)sender {
& & self.nestViewController = [[NestedViewController alloc]initWithNibName:@"NestedViewController" bundle:nil];
& & [self presentViewController:self.nestViewController animated:NO completion:nil];
NestedViewController 有个dismiss button
- (IBAction)dismiss:(id)sender {
& & [self dismissV...
我在使用navigationController 操作tableview中值的设定时
我希望在每次调用到viewWillAppear方法的时候
都能刷新一下所有tableViewCell中的cell
代码应该怎么写?
还有个问题是
怎样在自定义的函数中取得所有tableViewCell中的值?
我在appDelegate文件中声明了一个UITabBarController *tabBarC
&&&&&& ...............
&&&&&&&& RadioPlayerViewController *radioPlayerViewController = [[RadioPlayerViewController alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&initWithNibName:nil bundle:nil];
&&&&UINavigationController *radioPlayerNavigationController = [[UINavigationController alloc]
&&&&&&&&&&&&&&&&&&&&&&&&&&...
請教各位高手,我使用Navigation Controller內含TableView(配合RSS read)
由下層tableview返回後主要的tableview
是否有辦法強迫主要的tableview reloaddata(重讀資料)
是使用下列事件嗎?
- (void)viewWillAppear:(BOOL)animated
我試是沒有作用
不知有何解決方法?
多謝各位高手
是不是要rootview才会调用viewwillappea的,我现在做的软件有navigation和tabbar,但是就是不能调用viewwillappea这个方法啊,很急啊,求高手们帮忙啊!想试过用rootview来创建项目,但是刚开始只能显示table,我要的是一个界面的label重新加载内容啊!

我要回帖

更多关于 swift viewwillappear 的文章

 

随机推荐