1,UIViewController用于管理view树,处理事件,以及将view树加到window中;
类似于android的Activity
2,viewController有一个关键的view属性,它代表view树的根,可以把它加入到UIWindow的subviews中;
3,只有当需要显示viewController时候,才初始化view对象,这称为懒加载; 可以通过loadView或者NIB文件的方式创建viewController的view树
4,当一个viewController创建的时候,它的view属性为nil,只有当外部对象访问viewController对象的view属性时候,才会调用loadView方法
5,指定使用NIB文件初始化一个viewcontroller
- (instancetype)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundle;
这个方法是viewcontroller的默认构造函数,不管是否使用nib都会被调用!
默认的loadview方法,已经实现了通过NIB初始化一个view树;
#import "BNRReminderViewController.h" @implementation BNRAppDelegate - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; // Override point for customization after application launch // This line will generate a warning, ignore it for now BNRHypnosisViewController *hvc = [[BNRHypnosisViewController alloc] init]; // This will get a pointer to an object that represents the app bundle NSBundle *appBundle = [NSBundle mainBundle]; // Look in the appBundle for the file BNRReminderViewController.xib BNRReminderViewController *rvc = [[BNRReminderViewController alloc] initWithNibName:@"BNRReminderViewController" bundle:appBundle]; self.window.rootViewController = hvc; self.window.rootViewController = rvc; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; return YES; }
6,Bundle是一个目录,用于存放资源和可执行文件
7,当创建一个XIB文件时,需要指定它的file owner,这个file owner是一个占位符;只有设置了,才能为IBOutlet和IBAction建立连接;
8,UITabBarController可以添加多个viewController,可以通过viewcontroller的tabBarItem设置tabBar上显示的名字和图标!
9,通知有local notification和push notifications;
push notifications有一个backend server?
10,创建一个本地通知
- (IBAction)addReminder:(id)sender { NSDate *date = self.datePicker.date; NSLog(@"Setting a reminder for %@", date); UILocalNotification *note = [[UILocalNotification alloc] init]; note.alertBody = @"Hypnotize me!"; note.fireDate = date; [[UIApplication sharedApplication] scheduleLocalNotification:note];
}
11,懒加载
只有在需要显示viewController的时候,才访问它的view属性(getView方法?);
接着会调用viewController的Loadview方法;
一般情况下,不要在构造函数中访问view属性,这样即使调用了构造函数,创建了一个viewController,也不会创建对应的view,起到懒加载的目的。
12,生命周期方法
application:didFinishLaunchingWithOptions: 程序第一次启动的时候调用
viewDidLoad 在第一次NIB加载成功的时候调用
viewWillAppear 在每次显示前调用
viewWillDisappear: and viewDidDisappear: 消失前调用,也是每次都会调用; 类似于android的onPause
在构造函数中,无法访问连接的IBOutLets属性,因为这时候NIB还没有加载成功
13,失真
在retina屏中,因为一个Point对应2*2,原有的按照1*1的图片就会出现失真,修正的方法是使用相对于大小的图片;
14, kvc
ios 使用kvc初始化一个outlets的属性
在nib文件加载过程中,使用kvc机制初始化;
必须有相关的get、set方法,否则会抛出异常