02 (协议代理)、自定义视图、程序执行顺序(iOS程序启动流程 )、视图控制器、(MVC的理解)
1.协议代理
这里需谨记它循环引用的实际例子。
2.自定义视图、懒加载
自定义视图LTView步骤 封装思想
根据需求的不同, 自定义视图继承的类也有所不同。一 般自定义的视图会继承于UIView。以下是LTView的要点:
1、创建一个UIView 类
2、在类的初始化方法中添加子视图
3、类的.h 件提供 一些接口 (方法),便于外界操作子视图。
假设我们使用 LTView类代表label-textfield视图。
我们创建 一个LTView类继承于UIView。
我们将LTView作为一个容器,在LTView的初始化方法中创建并添加label和textField。
此时的LTView就变成了一个具有label和textField的视图了。
注意:
1.往往我们需要对LTView中的Label或者Textfield进一定的控制, 如:设置Label的text,获取Textfield的text,给Textfield指定delegate,设置textColor等。
2.为了方便外界操作Label和Textfield,因此我们要为外界提供一些方法。
懒加载
本质原理就是重写属性的get方法,好处就是当我们需要用到的时候在初始化它,起到一个延时的加载作用
- (UILabel *)descLable{
// 当属性每次调用get方法的时候,首先判断该对象是否存在,如果存在直接返回,如果不存在直接创建
if (!_descLable) {
_descLable = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 80, 30)];
[self addSubview:_descLable];
}
return _descLable;
}
3.iOS程序启动流程
注意
其中包括main函数,整个应用的代理 AppDelegate.熟悉AppDelegate里面的代理方法
// 5、程序加载完成之后,就会执行该代理方法,在该方法中我们为应用程序创建window等必要的界面
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
NSLog(@"---%s",__func__);// 打印方法名
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
[self.window setRootViewController:[[UIViewController alloc] init]];// 视图控制器
//创建一个视图控制器对象
RootViewController *rootVC = [[RootViewController alloc] init];
//将创建好的视图控制器设置为window的根视图控制器
[self.window setRootViewController: rootVC];
return YES;
}
// 6、程序即将结束活跃状态(例如:来电,突然来短信,就会执行该方法)。一般在该方法中做一些必要信息的存储,和一些暂停动作。(例如,游戏正在进行时,要暂停游戏。)
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"---%s", __func__);//
}
// 7、程序已经进入后台,如果程序长期在后台待着,有可能退出。所以,在改进方法中要进行一些重要数据的持久化。
// 一般在该方法中保存应用程序的数据, 以及状态
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"---%s", __func__);
}
// 8、程序即将进入前台,一般是在程序由后台进入的时候会执行该方法。
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"---%s", __func__);
}
// 9、程序已经变得活跃(程序启动或者由后台进入前台都会执行该方法)。
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"---%s", __func__);
}
// 10、应用程序即将退出终止的时候会调用该方法
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"--%s", __func__);
}
注意:
模拟window类中的setRootViewController的set方法(笔试)
- (void)setRootViewController:(UIViewController *)rootViewController{
if (_rootViewController != rootViewController) {
[_rootViewController release];
}
_rootViewController = [rootViewController retain];
}
[self addSubView:_rootViewController.view];//此时这个self是window!!!
系统内部已经帮我们实现~~~~~
5.视图控制器
重点
熟悉视图控制器的生命周期,注意点为,viewDidLoad只会执行一次!
//1).创建一个视图控制器的时候,系统会帮我们创建一个自带的和屏幕等宽高的视图(view)作为视图控制器的属性。
/*加载视图控制器自带的视图
当使用到该视图控制器自带的view的时候(调用view属性的get方法的时候),才会调用loadView方法创建的该view*/
- (void)loadView{//重写Controller的loadView系统方法
NSLog(@"--%s", __func__);
/* 如果我们使用自定义的视图,那么就不要调用父类的view [super loadView] */
}
//2).视图加载完毕
- (void)viewDidLoad {
[super viewDidLoad];
[self.view addSubview:[self creatLabel]];//
NSLog(@"--%s", __func__);
}
//3).视图即将出现
- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"--%s", __func__);
}
//4).视图已经出现
- (void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"--%s", __func__);
}
//5).试图即将消失
- (void)viewWillDisappear:(BOOL)animated{
[super viewWillDisappear:animated];
NSLog(@"--%s", __func__);
}
//6).视图已经消失
- (void)viewDidDisappear:(BOOL)animated{
[super viewDidDisappear:animated];
NSLog(@"--%s", __func__);
}
//7).被释放掉了
- (void)dealloc{
//arc下dealloc方法可以被重写,但是不能在内部使用[super dealloc];
// [super dealloc];
}
功能
1.控制视图显示 ,响应事件。
2.分担AppDelegate的工作。实现模块独立 ,提高复用性。
3.控制视图大小变换、布局视图、响应事件。
4.检测以及处理内存警告。
5.检测以及处理屏幕旋转。
6.检测视图的切换。
使用方法
1.定义UIViewController的子类
2.创建视图控制器对象,作为window的根视图控制器
3.在viewDidLoad中使用默认创建好的视图对象view