UIApplication及UIWindow

一、项目设置
 
项目中的 Info.plist 文件中的一些常用设置(括号中为 xml 中的对应键值):
 
Localiztion native development region (CFBundleDevelopmentRegion)-本地化相关
 
Bundle display name (CFBundleDisplayName)-程序安装后显示的名称,限制在10-12个字符,如果超出,将被显示缩写名称
 
Icon file (CFBundleIconFile)-app图标名称,一般为Icon.png
 
Bundle version (CFBundleVersion)-应用程序的版本号,每次往App Store上发布一个新版本时,需要增加这个版本号
 
Main storyboard file base name (NSMainStoryboardFile)-主storyboard文件的名称
 
Bundle identifier (CFBundleIdentifier)-项目的唯一标识,部署到真机时用到
 
二、UIApplication 
 
UIApplication对象是应用程序的象征 每一个应用都有自己的UIApplication对象,而且是单例的, 通过[UIApplication sharedApplication]可以获得这个单例对象。 一个iOS程序启动后创建的第一个对象就是UIApplication对象 ,利用UIApplication对象,能进行一些应用级别的操作 ,以下是一些常用属性和方法:
 
1、
 @property(nonatomic) NSInteger applicationIconBadgeNumber;
 //设置应用程序图标右上角的红色提醒数字

 

 
从 iOS 8 开始,要想在应用图标上显示 badgeNumber 必须获得用户授权,请求授权代码是:
 
 
要注意,请求授权只在 iOS 8 及以上才需要,若在 iOS 8 一下系统中请求会报错
 
2、
 @property(nonatomic,getter=isNetworkActivityIndicatorVisible) BOOL networkActivityIndicatorVisible;
 //设置联网指示器的可见性
 

 

3、
 - (BOOL)openURL:(NSURL*)url 
 //打开资源,包括本地资源和网络资源

 

 
  • 打电话 :
 
     UIApplication *app = [UIApplication sharedApplication];
 
     [app openURL:[NSURL URLWithString:@"tel://10086"]];

 

 
  • 发短信
 
     
[app openURL:[NSURL URLWithString:@"sms://10086"]];

 

 
  • 发邮件
 
    
 [app openURL:[NSURL URLWithString:@"mailto://[email protected]"]];

 

 
  • 打开一个网页资源
 
   
  [app openURL:[NSURL URLWithString:@"http://www.google.com"]];

 

 
  • 打开其他app程序
 
4、管理状态栏
 
从iOS7开始,系统提供了2种管理状态栏的方式 :
  • 通过 UIViewController 管理,每一个 UIViewController 都可以拥有自己不同的状态栏
  • 通过 UIApplication 管理,一个应用程序的状态栏都由它统一管理,缺点是一个应用只有一个样式状态栏
 
默认情况下,状态栏都是由UIViewController管理的,UIViewController实现下列方法就可以轻松管理状态栏的可见性和样式 :
 
- (UIStatusBarStyle)preferredStatusBarStyle;
//状态栏样式
 
- (BOOL)prefersStatusBarHidden;
//设置状态栏是否可见

 

 
要想让 UIApplication 来管理状态栏,需要修改配置文件下列属性为 NO:
 
技术分享
- (void)setStatusBarHidden:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation
//使用动画来隐藏状态栏

 

 
三、UIApplication 的 delegate
 
UIApplication 的 delegate 代理主要用于处理一些系统事件 ,比如应用程序的生命周期事件(如程序启动和关闭) 、系统事件(如来电、接收通知)、内存警告 等等
 
每次新建完项目,都有个带有 “AppDelegate” 字眼的类,它就是UIApplication的代理
 
UIApplication 的 delegate 方法,也是应用的生命周期方法:
 
// app加载完毕的时候调用(一般只调用一次)
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
 
//app进入前台的时候调用(app显示出来)
- (void)applicationWillEnterForeground:(UIApplication *)application
 
//当app获得焦点的时候调用(这时候整个app的UI控件都能正常使用)
- (void)applicationDidBecomeActive:(UIApplication *)application
 
//app失去焦点的时候调用(UI控件不能正常使用)
- (void)applicationWillResignActive:(UIApplication *)application
 
// app进入后台的时候调用(app消失不见)
- (void)applicationDidEnterBackground:(UIApplication *)application
 
 
//app进入后台休眠时调用,此时不能接收事情(比如关闭)app关闭的时候调用(一般情况下不会调用)
- (void)applicationWillTerminate:(UIApplication *)application

 

 
 
四、UIWindow
 
1、UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow ,iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了 一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow 也就说,没有UIWindow,就看不见任何UI界面
 
 
技术分享
 
    - (void)makeKeyWindow;
//    让当前UIWindow变成keyWindow(主窗口)
   
    - (void)makeKeyAndVisible;
//    让当前UIWindow变成keyWindow,并显示出来
 
   
    - (void)addSubview:(UIView *)view;
//    直接将view添加到UIWindow中,但并不会理会view对应的UIViewController
   
    @property(nonatomic,retain) UIViewController *rootViewController;
//    自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期
 
    [UIApplication sharedApplication].windows
//    在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象
//    (平时输入文字弹出的键盘,就处在一个新的UIWindow中)
   
    [UIApplication sharedApplication].keyWindow
//    用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow
   
    view.window
//    获得某个UIView所在的UIWindow

 

 
 
五、程序启动过程
 
1、启动过程
 
 
技术分享
 
程序启动的完整过程:
 
  • main函数
  • 创建UIApplication对象,创建UIApplication的delegate对象
  • delegate对象开始处理(监听)系统事件(没有storyboard),程序启动完毕的时候, 就会调用代理application:didFinishLaunchingWithOptions:方法,在application:didFinishLaunchingWithOptions:中创建UIWindow,创建和设置UIWindow的rootViewController,显示窗口
  • 根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard),创建UIWindow,创建和设置UIWindow的rootViewController,显示窗口
 
 
 
2、main 函数
1 int main(int argc, char * argv[]) {
2     @autoreleasepool {
3         return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
4     }
5 }
6  

 

  • argc、argv:直接传递给UIApplicationMain进行相关处理即可
  • principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
  • delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议
 
 
3、UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,并将该delegate对象赋值给UIApplication对象中的delegate属性 ,接着会建立应用程序的Main Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法) ,程序正常退出时UIApplicationMain函数才返回
 
 
从 storyboard 中创建应用过程:初始化一个 window — > 加载 initial 控制器 —-> 将控制器设置为window 的根控制器
 
 
技术分享
 
 
 
 
 
 
 
 
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。