一 delegate
- (BOOL)textFieldShouldReturn:(UITextField*)textField{
[ textField resignFirstResponder];
returnYES;
}
二程序的启动流程
1⃣ main 函数是程序入口
int main(int argc,char * argv[]){
@autoreleasepool{
return UIApplicationMain(argc,argv,nil,NSStringFromClass([
AppDelegate class]));
}
}
执行 UIApplicationMain函数时做了跳转,转到 AppDelete中
2⃣ UIApplicationMain在程序入口函数 main 函数中调用,主要实现了3个功能:
①创建应用程序(UIApplication)实例
②创建应用程序代理实例,代理的主要作用是,监听应用程序是如何执行的.
③建立时间循环(runloop: 死循环,不断检测程序运行状态,是否被触摸,晃动等)不断的监听,直到程序退出为止.
3⃣ UIApplicationMain 剖析
int UIApplicationMain(
int argc;
char *argv[];
NSString *principalClassName;
NSString *delegateClassName;
)
principalClassName:应用程序对象的类名(UIApplication 或其子类)
delegateClassName:应用程序 delegate 的类名.(任何接受了 UIApplicationDelegate 的类)
UIApplicationMain根据上述两个类名创建应用程序实例,应用程序代理实例,然后建立事件循环(runloop),检测程序的各种事件(程序开始启动,接收到触摸等等)
4⃣ 应用程序代理,主要检测应用程序的状态并做出相应的处理.
应用程序的状态有很多,比如:程序启动,进入活跃状态,进到后台,内存警告,收到远程消息
任何接受了 UIApplicationDelegate协议的对象都可以成为应用程序代理
一旦应用程序的某种状态触发,就会执行相应的代理方法.
5⃣ UIApplicationDelegate 是一个 OC 的协议.里面声明了一堆方法,这些方法都与应用程序运行状态有关,它们由应用程序代理实现. UIApplication 对象负责调用.
6⃣ UIApplicationDelegate 中的方法:
①- (BOOL)application: (UIApplication*)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions{}
告诉 delegate 程序启动即将完成,程序准备要运行.(delegate 实现这个方法时,要创建 window 对象,将程序内容通过 window 呈现给用户)
②- (void)applicationDidBecomeActive:(UIApplication *)application{}
告诉 delegate 应用程序已经进入活跃状态,(重新执行被暂停的任务)
③- (void)applicationWillResignAction:(UIApplication *)application{}
告诉代理程序即将进入非活跃状态,(暂停游戏,停止 timer 等)
④- (void)applicationDidEnterBackground:(UIApplication *)application{}
告诉 delegate 应用程序已经进入到了后台,(存储用户数据,释放一些共享资源,停止 timer 等)
⑤- (void)applicationWillEnterForeground:(UIApplication *)application{}
告诉delegate 应用程序即将进入前台(取消所有进入后台时暂停的任务)
7⃣ 查看各个代理的执行顺序.
使用 NSLog(@”%@”,__FUNCTION__,__LINK__);
三 自定义视图
就是将一些简单的控件进行组合,编写出符合自己需求的控件.
要做到(可复用,可移植,可精炼)
在自定义控件的时候,可以将控件封装到一个类中,进行调用显示.
下面的是一个 LTVIEW 类控件:
1⃣ 首先在. H 文件中需要定义两个实例变量
@proterty (retain,nonatomic)UILable *label;
@proterty (retain,nonatomic)UITextField *field;
2⃣ 在. M 文件中封装控件
- (void)dealloc{
[_textField release];
[_lable release];
[super dealloc];
}
重写 UIView 的初始化方法
- (id)initWithFrame:(CGRect)frame{
self = [super initWithFrame:frame];
if(self){
[self p_setUp];
}
return self;
}
创建方法
- (void)p_setUp{
_label = [[UILabelalloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width/3, self.frame.size.height)];
_label.backgroundColor = [UIColoryellowColor];
[selfaddSubview:_label];
[_labelrelease];
_textField = [[UITextFieldalloc]initWithFrame:CGRectMake(_label.frame.size.width, 0, self.frame.size.width*2/3, self.frame.size.height)];
_textField.backgroundColor = [UIColorredColor];
[selfaddSubview:_textField];
[_textFieldrelease];
}
调用方法:首先引入头文件
// 使用自定义的视图类
LTView *view = [[LTView alloc]initWithFrame:CGRectMake(10, 20, 300, 40)];
view.backgroundColor = [UIColor whiteColor];
[self.window addSubview:view];
[view release];
四 视图控制器
1. 视图控制器的作用:
1⃣响应事件
2⃣分担 AppDelegate 的工作
3⃣实现模块独立,提高复用性
2. 创建 UIViewController 对象
UIViewController*control = [[UIViewController alloc]init];
UIViewController,自身带了一个UIView, 默认的大小和屏幕的大小一样
每个 window 都带有一个根视图,如果不给根视图,默认根视图就是它本身
设置 self.window 的跟视图控制器
self.window.rootViewController= control;
设置控制器的背景颜色
control.view.backgroundColor= [UIColor yellowColor];
设置按钮添加的时候;[control.view addSubview:button];
3. 使用自定义视图控制器进行操作
MyViewController*control = [[MyViewController alloc]init];
将根视图控制器设置为 control
self.window.rootViewController= control;
[controlrelease];
控制器内容如下图所示:
出事话方法和加载视图:
实现视图加载的方法:
内存处理的方法:
重写 didReceiveMemoryWarning方法:
- (void)didReceiveMemoryWarning{
[superdidReceiveMemoryWarning];
//根视图已经加载过,根视图未显示
if([selfisViewLoaded] == YES && self.view.window == nil)
{
//将根视图销毁
self.view= nil;
}
}
4. 创建旋转视图控制器
RotationViewController*rotation = [[RotationViewController alloc]init];
将根视图设置为 rotation
self.window.rootViewController= rotation;
[rotationrelease];
控制器视图加载视图的实现:
屏幕旋转检测: