UIApplication应用程序执行的顺序
1.UIApplication应用程序类,一个应用程序只需要一个UIApplication对象,因为一个工程只能制作一个应用程序
:
did
didFinishLaunchingWithOptions:应用程序正在进行加载的时候调用此方法,此方法的主要作用,创建window对象,并将window设置主窗口且使其可见;所有当你在应用程程序上显示其他内容要把它添加到此方法中
FinishLaunchingWithOptions:
#pragma mark 1.应用程序开始加载的状态
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]autorelease];
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]autorelease];
打印程序方法的执行过程
__FUNCTION__执行的方法名
__LINE__
显示的是
NSLog
方法在哪一行
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
[self.window makeKeyAndVisible];
return YES;
}
2. #pragma mark 2应用程序已经处于活跃状态,应用程序已经在屏幕上运行了
重启应用程序中没开启的任务或者程序进入后台时被暂停的任务,如果应用程序之前在后台,也可以刷新一下用户界面
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
}
3. #pragma mark 3 应用程序将要取消活跃状态,触发的因素(来电话,来短信,退出应用程序,手动进入后台)
//可以使用此方法暂停正在运行的任务,或者是让定时器暂停,或者暂停游戏
- (void)applicationWillResignActive:(UIApplication *)application {
//可以使用此方法暂停正在运行的任务,或者是让定时器暂停,或者暂停游戏
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
}
4. #pragma mark 4程序已经进入后台了,
用这个方法可以用来释放共享的资源,存储用户信息,是定时器无效,存储用户当前状态下的信息,以备下次恢复
如果你的应用程序支持后台运行,当用户退出的时候,这个方法将替代
applicationWillTerminate
:
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
}
5. #pragma mark 5.应用程序即将进入前台
唤醒进入后台时的任务
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
}
6.main函数的作用
UIApplicationMain
()此函数的三大功能:
(1)创建应用程序对象,每一个应用程序都是一个应用程序对象
(2)创建事件死循环(runloop,死循环),用于及时处理用户的操作,时时刻刻检测屏幕上有没有用户交互事件,一旦用户进行交互,可以立刻对用户的操作做出响应
(3)设置应用程序的代理对象,用来监测应用程序的运行状态
AppDelegate class获取一个类;
[A class]如果类 A调用class方法,则返回类A
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
自定义视图
1.数据源:
label上的数据源
NSArray *texts = @[@"用户名",@"密 码",@"确认密码",@"手 机",@"邮 箱"];
2.textField上的数据源
NSArray *placeholds = @[@"请输入用户名",@"请输入密码",@"请输入确认密码",@"请输入手机号",@"请输入邮箱"];
3.我们自己定义的控件叫做自定义复合视图,因为系统没有为我们提供需要的控件
for (int i = 0; i < 5; i++) {
LTView *view = [[LTView alloc]initWithFrame:kCGRectMake_6];
//给label赋值
view.label.text = texts[i];
//给fleld赋值
view.field.placeholder = placeholds[i];
//设置代理
view.field.delegate = self;
//给View设置tag值
view.tag = 200 + i;
// view.backgroundColor = [UIColor redColor];
[contentview addSubview:view];
LTView *view = [[LTView alloc]initWithFrame:kCGRectMake_6];
//给label赋值
view.label.text = texts[i];
//给fleld赋值
view.field.placeholder = placeholds[i];
//设置代理
view.field.delegate = self;
//给View设置tag值
view.tag = 200 + i;
// view.backgroundColor = [UIColor redColor];
[contentview addSubview:view];
[view release];
@property(nonatomic,retain)UILabel *label;
@property
(
nonatomic
,
retain
)
UITextField
*field;
4.释放掉对象属性
- (void)dealloc
{
self.label = nil;
self.field = nil;
[super dealloc];
{
self.label = nil;
self.field = nil;
[super dealloc];
}
5.重写父类的初始化方法
-(instancetype)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame:frame]) {
[self p_setup];
}
return self;
}
{
if (self = [super initWithFrame:frame]) {
[self p_setup];
}
return self;
}
6.封装成一个方法
-(void)p_setup{
_label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width/2, self.frame.size.height)];
// _label.backgroundColor = [UIColor blueColor];
[self addSubview:_label];
[_label release];
_field = [[UITextField alloc]initWithFrame:CGRectMake(self.frame.size.width/2, 0, self.frame.size.width/2, self.frame.size.height)];
// _field.backgroundColor = [UIColor redColor];
[self addSubview:_field];
[_field release];
}
_label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0, self.frame.size.width/2, self.frame.size.height)];
// _label.backgroundColor = [UIColor blueColor];
[self addSubview:_label];
[_label release];
_field = [[UITextField alloc]initWithFrame:CGRectMake(self.frame.size.width/2, 0, self.frame.size.width/2, self.frame.size.height)];
// _field.backgroundColor = [UIColor redColor];
[self addSubview:_field];
[_field release];
}
7. -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
//获取父类视图
UIView *contenView = [self.window viewWithTag:300];
for (int i = 0; i < 5; i++) {
//此时contentView上的控件是我们自定义出来的LTView,所以根据tag取出控件应该强制转换为LTView
LTView *view = (LTView *)[contenView viewWithTag:200 + i];
[view.field resignFirstResponder];
}
//获取父类视图
UIView *contenView = [self.window viewWithTag:300];
for (int i = 0; i < 5; i++) {
//此时contentView上的控件是我们自定义出来的LTView,所以根据tag取出控件应该强制转换为LTView
LTView *view = (LTView *)[contenView viewWithTag:200 + i];
[view.field resignFirstResponder];
}
}
UIViewController 视图控制器
1.UIViewController继承自UIResponder,是一个专门管理视图的一个类,只能用来管理单视图控制器
2.概念误区:视图控制器不是一个视图,是用来管理视图的,而且视图控制器自带了一个管理视图的一个根视图
3.UIViewController主要作用:
(1)管理视图
(2)响应事件
(3)分担Appdelegate的工作
(4)实现MVC模式
4. #pragma mark 视图控制器写在这并没有减轻AppDelegate的工作,
UIViewController
*viewController = [[
UIViewController
alloc
]
init
];
//将ViewController指定为根视图控制器
self.window.rootViewController = viewController;
[viewController release];
//访问试图控制器自带的View,此View的大小和window的大小一样大
viewController.view.backgroundColor = [UIColor greenColor];
UIView *redView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
redView.backgroundColor = [UIColor redColor];
[viewController.view addSubview:redView];
[redView release];
5. //创建自定义视图控制器对象
RootViewController *rootVC = [[RootViewController alloc]init];
//将rootVC指定为window的根视图控制器
self.window.rootViewController = rootVC;
RootViewController *rootVC = [[RootViewController alloc]init];
//将rootVC指定为window的根视图控制器
self.window.rootViewController = rootVC;
//释放rootVC
[rootVC release];
[rootVC release];
6. //加载根视图的时候触发此方法
//如果要是重写loadview方法,第一种必须实现[super loadView]
//第二种方法:自定义一个视图,赋值给视图控制器自身所带的视图
-(void)loadView{
[super loadView];//父类对该方法的实现是加载一个UIView对象,试图控制器自身所带的View就是由此方法创建出来的
//自定义试图控制器自身所带的视图View
// UIView *newView = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
// self.view = newView;
// [newView release];
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
//如果要是重写loadview方法,第一种必须实现[super loadView]
//第二种方法:自定义一个视图,赋值给视图控制器自身所带的视图
-(void)loadView{
[super loadView];//父类对该方法的实现是加载一个UIView对象,试图控制器自身所带的View就是由此方法创建出来的
//自定义试图控制器自身所带的视图View
// UIView *newView = [[UIView alloc]initWithFrame:[UIScreen mainScreen].bounds];
// self.view = newView;
// [newView release];
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
}
7. 当发现自身所带的View为nil,会在去调用loadView,直到发现View不在为nil就不在调用loadView方法
//当视图控制器自带的View加载完成时触发
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
//使用self.View访问自定义视图所带的View
self.view.backgroundColor = [UIColor greenColor];
//想添加的视图且在这个方法中
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];
//当视图控制器自带的View加载完成时触发
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
//使用self.View访问自定义视图所带的View
self.view.backgroundColor = [UIColor greenColor];
//想添加的视图且在这个方法中
UIView *view = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
view.backgroundColor = [UIColor redColor];
[self.view addSubview:view];
[view release];
8. //当内存出现警告的时候自动调用此方法
//在这个方法中需要释放掉暂时不使用的资源
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
NSLog(@"警告了 警告了,你TMD的警告了");
//[self isViewLoaded]用来判断视图控制器自带的View是否已经加载
//self.view.window查看根视图有没有在window上显示
if ([self isViewLoaded] && ! self.view.window) {
//安全的将视图删除
self.view = nil;
}
// Dispose of any resources that can be recreated.
}
//在这个方法中需要释放掉暂时不使用的资源
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
NSLog(@"警告了 警告了,你TMD的警告了");
//[self isViewLoaded]用来判断视图控制器自带的View是否已经加载
//self.view.window查看根视图有没有在window上显示
if ([self isViewLoaded] && ! self.view.window) {
//安全的将视图删除
self.view = nil;
}
// Dispose of any resources that can be recreated.
}
9. //当设备发生旋转时,当前界面不发生变化,就意味着不支持选择
-(BOOL)shouldAutorotate
{
return YES;
}
//设置界面支持的旋转方向
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
-(BOOL)shouldAutorotate
{
return YES;
}
//设置界面支持的旋转方向
-(NSUInteger)supportedInterfaceOrientations{
return UIInterfaceOrientationMaskAll;
}
10.//当旋转屏幕的时候触发,ios8之后才有效
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
//size是将要旋转到的屏幕的尺寸
NSLog(@"%@",NSStringFromCGSize(size));
/*
if (size.width < size.height) {
//把竖屏状态坐标赋值给控件
}else{
//把横屏状态坐标赋值给控件
}
*/
}
-(void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
//size是将要旋转到的屏幕的尺寸
NSLog(@"%@",NSStringFromCGSize(size));
/*
if (size.width < size.height) {
//把竖屏状态坐标赋值给控件
}else{
//把横屏状态坐标赋值给控件
}
*/
}
//视图控制器的指定初始化方法,就是你无论调用哪个方法初始化一个视图控制器对象,都会走的哪个方法就叫做指定初始化方法
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
}
return self;
}
- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
NSLog(@"%s,%d",__FUNCTION__,__LINE__);
}
return self;
}