1.Xcode程序文件的区别
- Xcode5有frameworks文件夹,用于存放导入的框架(需要手动导入);而Xcode6没有frameworks文件夹,看不到导入的框架,用LaunchScreen.xib来设置启动界⾯面;Xcode7也看不到导入的框架,用LaunchScreen.storyBoard设置启动界面.
- Xcode7如果没有设置启动图片,模拟器默认的尺寸⼤小是4s的尺寸⼤小.(可以打印屏幕尺⼨寸验证.).
- 它的底层实现其实把LaunchScreen上的东西,生成了一张图片,然后把这张图片设为程序的启动图片. 可以进入沙盒当中查看, 查看方法,找到应⽤用程序根目录. 获取⽅法: NSLog(@"%@",NSHomeDirectory()); 打印出来,后前往⽂件夹.找到Library->Caches->Snapshots目录下⾯面.最后一层就是程序自动生成的图片.
2.项目中常见的文件(info.plist)
- Supporting file⼀般都是放些资源⽂文件,像一些plist这些等.
- xcode5当中也有info.plist,只不过它的名字很长.是工程的名称.在xcode5当中,会⾃动生成⼀个pch文件,在Xcode6当中不会帮我们生成PCH文件.
- Bundle Name:应用程序的名称.
- Bundle versionstring,short:应⽤程序的版本.在开发当中都是迭代开发.苹果要求下⼀次提交的版本必须得要比上⼀次提交的版本要⾼.
- Bundle Version:应用程序编译的版本.
- Bundle identifier:应用程序标识符.保证应用程序的唯一性,
- 如果两个应⽤同⼀个标识符,那么之前的那个应用会被干掉.
3.PCH文件
- 作用:PCH的作⽤用:存放一些公用的宏以及存放一些公用的文件.
- 只要在pch当中定义的东西, 会被整个应用程序共享.
- PCH它是一个预编译文件,要告诉系统要提前编译它.要去做一些配置. 在Buld Setting 当中找perfix 找到Precomplie prefix Header 设为yes.如下图所示:
-
- 设完这些后,再进行prefix Header的路径配置.路径从根层开始.如下图所示:
4.UIApplication单例
- 一个iOS程序启动后创建的第一个对象就是UIApplication对象我们只能通过[UIApplicationsharedApplication]获得这个单例对象,不能够⼿动去创建它.
- UIApplication的作用:(1)利⽤用UIApplication对象,能进行一些应用级别的操作.(2)可以设置应⽤用程序图标右上角的红色提醒数字(3)设置联网指示器的可见性(4)可以设置应用程序的状态栏 (5)进⾏行应用之间的跳转.
4.1设置应⽤用提醒数字
- 获取UIApplication对象 UIApplication *ap = [UIApplication sharedApplication];
- 在设置之前, 要注册⼀个通知: UIUserNotificationSettings *notice = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
- 注册通知对象 [ap registerUserNotificationSettings:notice];
- 设置提醒数字 ap.applicationIconBadgeNumber = 10;
4.2设置联网状态
ap.networkActivityIndicatorVisible = YES;
4.4设置状态栏
- -(UIStatusBarStyle)preferredStatusBarStyle{ return UIStatusBarStyleLightContent; }
- 隐藏状态栏,通过控制器的⽅式.同样实现方法 返回NO时为不隐藏:-(BOOL)prefersStatusBarHidden{ return NO; }
- 返回YES时为隐藏 -(BOOL)prefersStatusBarHidden{ return YES; }
5.UIApplication代理
- 所有的移动操作系统都有个致命的缺点:app很容易受到打扰。 ⽐如一个来电或者锁屏会导致app进入后台甚至被终止 还有很多其它类似的情况会导致app受到干扰,在app受到干扰时,会产⽣一些系统事件, 这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件
- UIApplication会在程序⼀启动时候创建一个遵守UIApplicationDelegate代理.这个就是我们程序 在这个类中很定义很多监听系统事件的⽅法.同时也定义了⼀些应⽤用程序的⽣命周期方法.主要方法如下
(1)应用程序启动完成的时候调用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions
(2)当我们应用程序即将失去焦点的时候调⽤
- (void)applicationWillResignActive:(UIApplication *)application { NSLog(@"%s",__func__);
}
(3)当我们应用程序完全进入后台的时候调⽤
- (void)applicationDidEnterBackground:(UIApplication *)application{ NSLog(@"%s",__func__);
}
(4) 当我们应⽤用程序即将进⼊入前台的时候调用
- (void)applicationWillEnterForeground:(UIApplication *)application { NSLog(@"%s",__func__);}
(5)当我们应⽤程序完全获取焦点的时候调用
只有当一个应用程序完全获取到焦点,才能与用户交互.
- (void)applicationDidBecomeActive:(UIApplication *)application { NSLog(@"%s",__func__);
}
(6)当我们应用程序即将关闭的时候调⽤用
- (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"%s",__func__);
}
6.应用程序的程动流程
- 1.执⾏行Main
- 2.执行UIApplicationMain函数.
- 3.创建UIApplication对象,并设置UIApplicationMain对象的代理. UIApplication的第三个参数就是UIApplication的名称,如果指定为nil,它会默认 为UIApplication. UIApplication的第四个参数为UIApplication的代理.
- 4.开启⼀一个主运⾏行循环.保证应用程序不退出.
- 5.加载info.plist.加载配置文件.判断一下info.plist文件当中Main storyboard file base name ⾥面有没有指定storyboard⽂件,如果有就去加载info.plist文件,如果没有,那么应用程序加载完毕.
7.UIWindow
- UIWindow是⼀种特殊的UIView,通常在一个app中⾄少有⼀个UIWindow,一个iOS程序之所以能显⽰示到屏幕上,完全是因为它有UIWindow
- 在加载info.plist,判断下是否指定main,如果指定了,就会去加载StoryBoard. 流程如下(1).创建一个窗口 (2).加载MainStoryBoard,初始化一个控制器. (3).把初始化出来的控制器设置为窗口的根控制器.让窗口显示到屏幕上.
7.1在开发当中,通常都是手动去创建窗口.
- (1).创建窗口,要有窗口显示,必须要有强引用.窗口也是控件,要想展示出来.必须得要有尺寸,代码为:self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
- (2).创建控制器 会把控制器的View添加到窗⼝上.并且有一个旋转的功能. UIViewController *vc = [[UIViewController alloc] init]; vc.view.backgroundColor = [UIColor redColor];
- (3).设置控制器为窗口的根控制器 self.window.rootViewController = vc;
- (4).显示窗口 [self.window makeKeyAndVisible];
(4.1)[self.window makeKeyAndVisible]的底层实现
- 1.窗口默认是隐藏的.hidden = yes. 底层做的事件就是: self.window.hidden = NO;
- 2把控制器的View添加到窗⼝上面. [self.window addSubView:rootVC.view];
- 3.把当前窗口设置成应⽤程序的主窗口 application.keyWindow获得应用程序的主窗口.
8.从StoryBoard加载控制器
- 1.创建窗⼝ self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
- 2.加载控制器 从StoryBoard当中加载控制器 UIStoryboardstoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 加载箭头指向的控制器 UIViewController vc = [storyBoard instantiateInitialViewController];
- 3.设置窗口根控制器 self.window.rootViewController = vc;
- 4.显示窗口 [self.window makeKeyAndVisible];
9.通过Xib加载控制器的View
- 1.创建窗口 self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; -2.从XIB当中加载控制器. MyViewController *vc = [[MyViewController alloc] initWithNibName:@"VC" bundle:nil]; -3设置窗⼝根控制器: self.window.rootViewController = vc; -4.显⽰示窗口 [self.window makeKeyAndVisible];操作如图:
1.创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 2.设置窗口的根控制器.
2.1从Xib当中加载控制器.
initWithNibName:如果指定了名称,那么它就会去加载指定名称的Xib.
MyViewController *vc = [[MyViewController alloc] initWithNibName:@"VC" bundle:nil];
如果没有指定名称.指定为nil,那么它就会去先加载跟它相同名称的Xib. 如果没有跟它相同名称的Xib,那么它就会再去加载跟它相同名称去点Controller的名字的Xib. MyViewController *vc = [[MyViewController alloc] initWithNibName:nil bundle:nil];
控制器的init⽅方法会调⽤用initWithNibName:⽅方法. MyViewController*vc= [[MyViewControlleralloc]init]; self.window.rootViewController = vc;
3.显⽰示窗⼝口
[self.window makeKeyAndVisible];