01-项目中常见的文件(LaunchScreen
)
- Xcode5
- 框架是苹果事先已经导入进去的.在项目的结构当中就能够看到导入的框架.
- Xcode6
- 会自动导入一些觉见的框架.在项目结构当中,看不到已经导入的框架.
- LaunchScreen.xib:用来设置启动界面.
- Xcode7
- 会自动导入一些觉见的框架.在项目结构当中,看不到已经导入的框架. LaunchScreen.storyBoard
- LaunchScreen原理:
- 会自动加载LaunchScreen是因为在Target当中,指定了Launch Screen file,
- 如果没有指定的话,就不会去加载
LaunchScreen
作为启动界面. - 如果没有设置启动图片,模拟器默认的尺寸大小是4s的尺寸大小.(可以打印屏幕尺寸验证.)
- 模拟器默认的尺寸是由启动界面决定的.
- 它的底层实现其实把LaunchScreen上的东西,生成了一张图片,然后把这张图片设为程序的启动图片.
- 可以进入沙盒当中查看, -查看方法,找到应用程序根目录.
- 获取方法:
NSLog(@"%@",NSHomeDirectory());
- 打印出来,后前往文件夹.找到
Library->Caches->Snapshots
目录下面.最后一层就是程序自动生成的图片.
- 获取方法:
02-项目中常见的文件(info.plist)
1.Supporting file
一般都是放些资源文件,像一些plist
这些等
2.xcode5当中也有info.plist,只不过它的名字很长.是工程的名称.
3.在xcode5当中,会自动生成一个pch文件,在Xcode6当中不会帮我们生成PCH文件.
4.info.plist当中保存着整个应用当中基本的配置.它是一个字典.查看它的类型.
这个当中,主要掌握三个Key
Bundle Name:应用程序的名称.
Bundle version string,short:应用程序的版本.在开发当中都是迭代开发.苹果要求下一次提交的版本必须得要比上一次提交的版本要高.
Bundle Version:应用程序编译的版本.
Bundle identifier:应用程序标识符.保证应用程序的唯一性
如果两个应用同一个标识符, 那么之前的那个应用会被覆盖.
当应用上传到AppStore的时候必须得要有标识符.当做推送的时候也必须得要Bundle identifier.Targets对应者info.plist.文件.
03-项目中常见的文件(PCH)
- PCH也是一个文件.一般PCH的名称跟项目的名称相同.
- PCH的作用:
- 存放一些公用的宏.
- 存放一些公用的文件.
- 只要在pch当中定义的东西, 会被整个应用程序共享.
- PCH它是一个预编译文件,要告诉系统要提前编译它.要去做一些配置. 在Buld Setting 当中找perfix 找到Precomplie prefix Header 为yes. 设完这些后,再进行prefix Header的路径配置.路径从根层开始.
- 1.定义一些常用公用的宏. 经常做一些系统的版本号的宏, 和一些屏幕的宏.
- 2.存放公用的头文件.分类的头文件
- 3.pch可以自定义Log.
- 在宏当中,
三个点...表示可变参数.
- 在函数当中,表示可变参数用:
__VA_ARGS__
Log(...) NSLog(__VA__ARGS__)
可以手动管理,直接注释掉.
- 在宏当中,
- PCH:注意PCH会把它当中的所有内容导入到工程当中所有的文件.但如果工程当中有C语言文件的时候,它也是会把它给导入到C语言的文件当中.如果这样的话, 就会发生错误.?
- 解决办法:每一个OC文件都会定义一个
__OBJC__
宏,只要判断有没有定义这样一个宏,就能看出是不是C语言的文件,如果没有定义这样的宏, 那就不需要导入这些东西.就不会报错.
04-UIApplication单例.
- 什么是UIApplication?
- UIApplication对象是应用程序的象征.
- 每一个应用都有自己的UIApplication对象,这个对象是系统自动帮我们创建的, 它是一个单例对象.
- 一个iOS程序启动后创建的第一个对象就是UIApplication对象
- 我们只能通过[UIApplication sharedApplication]获得这个单例对象,不能够手动去创建它.
- UIApplication作用?
- 利用UIApplication对象,能进行一些应用级别的操作.
- 可以设置应用程序图标右上角的红色提醒数字
- 设置联网指示器的可见性
- 可以设置应用程序的状态栏
- 进行应用之间的跳转.
- 模仿UIApplication单例.
要求:程序一启动就创建创建对象创建的对象只能通过share的方式获取对象.不能够进行alloc 操作,当执行alloc时, 程序发生崩溃
- 1.程序一启动的时候就创建对象.当类被加载到内存的时候就会调用load的方法,它会比main优先调用
- 2.保证调用alloc时会产生异常.重写系统的是alloc方法
- 3.通过share方式获取对象
#import "Person.h"
@implementation Person
// 保证只创建一次,所以static修饰,让其保存到静态区
static Person *_person;
// 当类加载到内存中就会调用这个方法, 在main函数之前调用
+ (void)load {
// 当类加载完毕就创建一个对象
_person = [[self alloc] init];
}
+ (instancetype)sharedPerson {
return _person;
}
+ (instancetype)alloc {
// 如果_person有值.直接让程序挂掉,并输出异常信息
if (_person) {
// 创建异常
NSException *exc = [NSException exceptionWithName:@"NSInternalInconsistencyException" reason:@"There can only be one UIApplication instance." userInfo:nil];
// 抛出异常
[exc raise];
}
// 如果没有值.调用 [super alloc]按照系统默认处理
return [super alloc];
}
@end
05-UIApplication功能
- 1.设置应用提醒数字
// 取得UIApplication对象
UIApplication *app = [UIApplication sharedApplication];
// 从iOS8之后,需要自己先注册用户通知,才能接受提醒
UIUserNotificationSettings *user = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
// 注册通知
[app registerUserNotificationSettings:user];
// 设置提醒数量
app.applicationIconBadgeNumber = 15;
- 2.设置连网状态
app.networkActivityIndicatorVisible = YES;
- 3.设置状态栏
- 从iOS7之后,状态栏默认是交给控制器来管理
- 需要修改工程的info.plist文件的View controller-based status bar appearance 为 NO
- 通常在开发当中都是应用程序来管理状态栏的.来做统一管理,不然的话, 会有很多个控制器.会非常的麻烦.
- 想要让应用程序管理状态栏,要在info.plist当中进行配置,
- 添加一个key值:是最后一个,View controller-based status bar appearance
- 设置为NO.就是应用程序来管理了.
- 通过UIApplication来管理状态.
// 隐藏状态栏
// app.statusBarHidden = YES;
// UIStatusBarStyleDefault 默认样式 黑色
// UIStatusBarStyleLightContent 白色
app.statusBarStyle = UIStatusBarStyleLightContent;
- 控制器管理
// 控制器设置状态栏样式和隐藏状态栏
- (UIStatusBarStyle)preferredStatusBarStyle {
return UIStatusBarStyleLightContent;
}
- (BOOL)prefersStatusBarHidden {
return YES;
}
4.openURL
// 打电话 tel:// 协议头 10010 指定电话
NSURL *url = [NSURL URLWithString:@"tel://10010"];
[app openURL:url];
// 发短信
NSURL *url2 = [NSURL URLWithString:@"sms://10010"];
[app openURL:url];
// 打开网页......邮件等等
NSURL *url3 = [NSURL URLWithString:@"http://www.king129.com"];
[app openURL:url3];
06- UIApplication代理和程序的启动流程.
- 所有的移动操作系统都有个致命的缺点:app很容易受到打扰。
- 比如一个来电或者锁屏会导致app进入后台甚至被终止
- 还有很多其它类似的情况会导致app受到干扰,在app受到干扰会产生一些系统事件,
- 这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件
- delegate可处理的事件包括:
- 应用程序的生命周期事件(如程序启动和关闭)
- 系统事件(如来电)
- 内存警告....等等
- UIApplication会在程序一启动时候创建一个遵守UIApplicationDelegate代理.
- 这个就是我们程序一创建时的AppDelegate类.AppDelegate就是遵守了UIApplicationDelegate协议.
- 在这个类中很定义很多监听系统事件的方法.同时也定义了一些应用程序的生命周期方法.
主要方法有:
/**
* 当程序启动完毕时,就会调用这个方法
*/
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"%s", __func__);
return YES;
}
/**
* 当获失去焦点是就会调用
*/
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 当程序进入后台时调用(比如按了 Home键)
*/
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 当程序从后台切换到前台时
*/
- (void)applicationWillEnterForeground:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 当程序获取焦点时调用
*/
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 程序已经退出时调用
*/
- (void)applicationWillTerminate:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/**
* 收到内存警告时调用.....
*/
- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
NSLog(@"%s", __func__);
}
2.应用程序的程动原理
- 底层原理为:
// 1.执行main --> UIApplicationMain
// 2.创建UIApplication对象,并设置他的代理
// 3.开启一个事件循环(主运行循环,死循环),保证程序一直运行
// 4.加载项目的info.plist文件,检查文件中是否有 Main ,如果有则加载 Main.storyboard,如果没有则执行\
application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 程序启动完毕
int main(int argc, char * argv[]) {
@autoreleasepool {
// 第三个参数: 设置UIApplication对象的名称
// 第四个参数: 创建代理对象, 遵守UIApplicationDelegate协议,并把这个对象设置为程序(UIApplication)的代理对象
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
07-UIWindow
- UIWindow是一种特殊的UIView,通常在一个app中至少有一个UIWindow
- iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,
- 最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
- 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow
- 在加载info.plist,判断下是否指定main,如果指定了,就会去加载StoryBoard.
- 1.创建一个窗口
- 2.加载MainStoryBoard,初始化一个控制器.
- 3.把初始化出来的控制器设置为窗口的根控制器.让窗口显示到屏幕上.
- 如果没有指定Mian话, 那这个时候就需要我们手动的去创建窗口.
- 当info.plist文件没有找到的时候,那么程序就加载完毕,那么在程序加载完毕时要自己手动去创建窗口.
- 在开发当中,通常都是手动去创建窗口.
- 创建窗口,要有窗口显示,必须要有
强引用
.窗口也是控件,要想展示出来.必须得要有尺寸
. - 在设置rootViewController的时候,会把控制器的View添加到窗口上面.
- 在程序当中,状态栏和键盘,它都属性是一个窗口.可以通过打印的方式来验证.
- 设置window的层级.
- UIWindowLevelNormal它是一个CGFloat类型.
self.window.windowLevel = UIWindowLevelNormal;
// 层级关系
UIWindowLevelNormal < UIWindowLevelStatusBar < UIWindowLevelAlert
08-从StoryBoard加载控制器
//1.创建窗口
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
//2.设置窗口根控制器
//从StoryBoard当中加载控制器.
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
//加载StoryBoard当中剪头指向的控制器
//UIViewController *vc = [storyBoard instantiateInitialViewController];
//加载指定标识的控制器.
UIViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"VC"];
self.window.rootViewController = vc;
//3.显示窗口
[self.window makeKeyAndVisible];
- 设置storyboard的标示
09-能过Xib加载控制器的View
- 加载的步骤为:
- 1.创建Xib
- 2.往xib当中拖入一个控制器.
- 3.设置Xib的file‘s owner类型为要设置的那个控制器.
- 4.把View与file‘s owner连线. (注意, 只有设置了file‘s owner类型才能够进行拖线.)
// 1.创建window
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
// 2.设置根控制器
// 从xib中加载控制器
// UIViewController *vc = [[SJViewController alloc] initWithNibName:@"SJViewController" bundle:nil];
// self.window.rootViewController = vc;
//指定名称为nil时.
//1.如果指定名称.会先去加载指定名称的Xib.
//2.如果没有指定xib名称,它会第一个先去找,跟它同名的xib.
//如果没有同名,它会去找同名,去掉Controller的xib.
//如果没有的话, 它会创建背景颜色为透明的View.
//3.如果没有指定xib名称,它会自动加载SJViewController去掉Controller的xib.
// UIViewController *vc = [[SJViewController alloc] initWithNibName:nil bundle:nil];
UIViewController *vc = [[SJViewController alloc] init];
// 控制器的init方法,底层实现原理就是调用 initWithNibName:
self.window.rootViewController = vc;
// 3.显示窗口
[self.window makeKeyAndVisible];
时间: 2024-08-03 09:55:48