UIApplication
一个iOS程序启动后创建的第一个对象就是UIApplication对象
利用UIApplication对象,能进行一些应用级别的操作
UIApplication是单例对象
- 不能进行重新初始化,比如[[UIApplication alloc] init],会直接报错的
错误写法
// reason: 'There can only be one UIApplication instance.'
// 原因:这儿只能有一个UIApplication实例
UIApplication *app = [[UIApplication alloc] init];
- 得到当前的UIApplication
UIApplication *app = [UIApplication sharedApplication];
设置图标提醒数
- set to 0 to hide. default is 0. In iOS 8.0 and later, your application must register for user notifications using -[UIApplication registerUserNotificationSettings:] before being able to set the icon badge.
- 如果设置是0,那么将会隐藏数字,默认就是0。在iOS8及之后,你在设置icon badge之前,必须注册一个-UIApplication registerUserNotificationSettings:
// 创建UIUserNotificationSettings
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
// 注册用户通知
[app registerUserNotificationSettings:setting];
// 设置图标提醒数
app.applicationIconBadgeNumber = 10;
设置网络请求状态
- 设为YES,将在状态栏处显示网络请求状态
app.networkActivityIndicatorVisible = YES;
设置隐藏状态栏
- Setting statusBarHidden does nothing if your application is using the default UIViewController-based status bar system.
- 如果你设置了使用默认的UIViewController-based管理状态栏,那么即使设置了setStatusBarHidden,也不会隐藏状态栏
- 如果想要隐藏状态栏,可以使用-prefersStatusBarHidden方法
- 如果在info.plist中,设置View controller-based status bar appearance 为NO,那么就是把状态栏管理交给UIApplication,下面这行代码就生效了
[app setStatusBarHidden:YES];
[app setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade];
打开指定URL
- URL:协议头://域名+路径 http,https,file,tel
-NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
[[UIApplication sharedApplication] openURL:url];
UIApplicationDelegate
/** 应用程序加载完毕 */
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
NSLog(@"%s", __func__);
return YES;
}
/** 应用将要失去焦点 */
- (void)applicationWillResignActive:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/** 应用程序进入后台 */
- (void)applicationDidEnterBackground:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/** 应用程序将要进入前台 */
- (void)applicationWillEnterForeground:(UIApplication *)application {
UIApplication *app = [UIApplication sharedApplication];
UIUserNotificationSettings *setting = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[app registerUserNotificationSettings:setting];
app.applicationIconBadgeNumber = 0;
NSLog(@"%s", __func__);
}
/** 应用程序获得焦点 */
- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"%s", __func__);
}
/** 程序将要关闭 */
- (void)applicationWillTerminate:(UIApplication *)application {
[self saveContext];
}
- 在Xcode中run程序的时候
- -[AppDelegate application:didFinishLaunchingWithOptions:]
-[AppDelegate applicationDidBecomeActive:]
-
然后点击home键
- -[AppDelegate applicationWillResignActive:]
- -[AppDelegate applicationDidEnterBackground:]
-
然后点击桌面的应用程序图标再次进入程序
- -[AppDelegate applicationWillEnterForeground:]
- -[AppDelegate applicationDidBecomeActive:]
UIApplicationMain
- main函数中执行了一个UIApplicationMain这个函数
int UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString *delegateClassName);
- argc、argv:直接传递给UIApplicationMain进行相关处理即可
- principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
- delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议
应用程序启动原理
- 打开程序
- 执行main函数(程序入口)
- 执行UIApplicationMain函数
- 创建UIApplication
- 创建UIApplicationDelegate,并使之成为UIApplication的代理
- 开启主运行循环,接收时间
- 加载info.plist,判断是否有main.storyboard,有就加载
加载main.storyboard
- 创建UIWIndow
- 加载main.storyboard,并且加载main.storyboard制定的控制器
- 把新创建的控制器作为窗口的根控制器,并让窗口显示出来
UIWindow
-
UIWindow是一种特殊的UIView
-
iOS程序启动完毕后,创建的第一个视图控件就是UIWindow,接着创建控制器的view,最后将控制器的view添加到UIWindow上,于是控制器的view就显示在屏幕上了
-
一个iOS程序之所以能显示到屏幕上,完全是因为它有UIWindow
-
也就说,没有UIWindow,就看不见任何UI界面
添加UIView到UIWindow中两种常见方式:
-
-(void)addSubview:(UIView *)view;
- 直接将view添加到UIWindow中,但并不会理会view对应的UIViewController
-
@property(nonatomic,retain) UIViewController *rootViewController;
- 自动将rootViewController的view添加到UIWindow中,负责管理rootViewController的生命周期
常用方法
-
-(void)makeKeyWindow;
让当前UIWindow变成keyWindow(主窗口) -
-(void)makeKeyAndVisible;
让当前UIWindow变成keyWindow,并显示出来
UIWindow的获得
-
[UIApplication sharedApplication].windows
- 在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象
(平时输入文字弹出的键盘,就处在一个新的UIWindow中)
- 在本应用中打开的UIWindow列表,这样就可以接触应用中的任何一个UIView对象
-
[UIApplication sharedApplication].keyWindow
- 用来接收键盘以及非触摸类的消息事件的UIWindow,而且程序中每个时刻只能有一个UIWindow是keyWindow。如果某个UIWindow内部的文本框不能输入文字,可能是因为这个UIWindow不是keyWindow
-
view.window
- 获得某个UIView所在的UIWindow