41-50(UIApplication和delegate,UIApplicationMain,UIWindow,程序启动的完整过程,控制器view的延迟加载)
41.UIApplication和delegate
42.UIPickerView
43.UIDatePicker
44.程序启动的完整过程
45.UIApplicationMain
46.UIWindow
47.如何创建一个控制器
48.控制器view的延迟加载
49.多控制器
50.UINavigationController的使用步骤
{
这几天一直在赶项目, 今天终于闲下来了!
今天是个好日子,空间里满天的2014520
那么来看看我们程序员的爱情吧!
爱情就是死循环,一旦执行就陷进去了。
爱上一个人,就是内存泄露你永远释放不了。
真正爱上一个人的时候,那就是常量限定,永远不会改变。
女朋友就是私有变量,只有我这个类才能调用。
情人就是指针,用的时候一定要注意,要不然就带来巨大的灾难。
}
41.UIApplication和delegate
在app受到干扰时,会产生一些系统事件,这时UIApplication会通知它的delegate对象,让delegate代理来处理这些系统事件
-
(void)applicationDidReceiveMemoryWarning:(UIApplication *)application;//
app接收到内存警告时调用
- (void)applicationDidEnterBackground:(UIApplication
*)application;// app进入后台时调用(比如按了home键)
- (BOOL)application:(UIApplication
*)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;//
app启动完毕时调用
每次新建完项目,都有个带有“AppDelegate”字眼的类,它就是UIApplication的代理
AppDelegate默认已经遵守了UIApplicationDelegate协议,已经是UIApplication的代理
42.UIPickerView
1.UIPickerView的常见属性
@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;
//数据源(用来告诉UIPickerView有多少列多少行)
@property(nonatomic,assign)
id<UIPickerViewDelegate> delegate;//
代理(用来告诉UIPickerView每1列的每1行显示什么内容,监听UIPickerView的选择)
@property(nonatomic)
BOOL showsSelectionIndicator; // 是否要显示选中的指示器
@property(nonatomic,readonly) NSInteger numberOfComponents;// 一共有多少列
2.UIPickerView的常见方法
- (void)reloadAllComponents;// 重新刷新所有列
- (void)reloadComponent:(NSInteger)component;// 重新刷新第component列
-
(void)selectRow:(NSInteger)row inComponent:(NSInteger)component
animated:(BOOL)animated;// 主动选中第component列的第row行
-
(NSInteger)selectedRowInComponent:(NSInteger)component;//
获得第component列的当前选中的行号
3.数据源方法(UIPickerViewDataSource)
-
(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView;//
一共有多少列
- (NSInteger)pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component;// 第component列一共有多少行
4.代理方法(UIPickerViewDelegate
- (CGFloat)pickerView:(UIPickerView
*)pickerView widthForComponent:(NSInteger)component;// 第component列的宽度是多少
- (CGFloat)pickerView:(UIPickerView *)pickerView
rowHeightForComponent:(NSInteger)component;// 第component列的行高是多少
-
(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row
forComponent:(NSInteger)component;// 第component列第row行显示什么文字
- (UIView
*)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(UIView *)view;
//
第component列第row行显示怎样的view(内容)
- (void)pickerView:(UIPickerView *)pickerView
didSelectRow:(NSInteger)row inComponent:(NSInteger)component;//
选中了pickerView的第component列第row行
43.UIDatePicker
1.常见属性
@property (nonatomic)
UIDatePickerMode datePickerMode;// datePicker的显示模式
@property
(nonatomic, retain) NSLocale *locale;// 显示的区域语言
2.监听UIDatePicker的选择
*
因为UIDatePicker继承自UIControl,所以通过addTarget:...监听
44.程序启动的完整过程
1.main函数
2.UIApplicationMain
*
创建UIApplication对象
*
创建UIApplication的delegate对
3.delegate对象开始处理(监听)系统事件(没有storyboard)
*
程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法
*
在application:didFinishLaunchingWithOptions:中创建UIWindow
*
创建和设置UIWindow的rootViewController
*
显示窗口
4.根据Info.plist获得最主要storyboard的文件名,加载最主要的storyboard(有storyboard)
*
创建UIWindow
* 创建和设置UIWindow的rootViewController
* 显示窗口
45.UIApplicationMain
main函数中执行了一个UIApplicationMain这个函数
int
UIApplicationMain(int argc, char *argv[], NSString *principalClassName, NSString
*delegateClassName);
argc、argv:直接传递给UIApplicationMain进行相关处理即可
principalClassName:指定应用程序类名(app的象征),该类必须是UIApplication(或子类)。如果为nil,则用UIApplication类作为默认值
delegateClassName:指定应用程序的代理类,该类必须遵守UIApplicationDelegate协议
UIApplicationMain函数会根据principalClassName创建UIApplication对象,根据delegateClassName创建一个delegate对象,
并将该delegate对象赋值给UIApplication对象中的delegate属性
接着会建立应用程序的Main
Runloop(事件循环),进行事件的处理(首先会在程序完毕后调用delegate对象的application:didFinishLaunchingWithOptions:方法)
程序正常退出时UIApplicationMain函数才返回
46.UIWindow
UIWindow是一种特殊的UIView,通常在一个app中只会有一个UIWindow
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中)
[UIApplication
sharedApplication].keyWindow
用来接收键盘以及非触摸类的消息事件的UIWindow,
而且程序中每个时刻只能有一个UIWindow是keyWindow。
如果某个UIWindow内部的文本框不能输入文字,
可能是因为这个UIWindow不是keyWindow
view.window//获得某个UIView所在的UIWindow
47.如何创建一个控制器
1.通过storyboard创建
先加载storyboard文件(Test是storyboard的文件名)
UIStoryboard *storyboard = [UIStoryboard
storyboardWithName:@"Test" bundle:nil];
接着初始化storyboard中的控制器
初始化“初始控制器”(箭头所指的控制器)
ViewController *mj = [storyboard
instantiateInitialViewController];
通过一个标识初始化对应的控制器
ViewController *mj =
[storyboard instantiateViewControllerWithIdentifier:@”mj"];
2.直接创建
ViewController *mj = [[ViewController alloc] init];
3.指定xib文件来创建
ViewController *mj = [[ViewController alloc]
initWithNibName:@"ViewController" bundle:nil];
48.控制器view的延迟加载
控制器的view是延迟加载的:用到时再加载
可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载
控制器的view加载完毕就会调用viewDidLoad方法
49.多控制器
一个iOS的app很少只由一个控制器组成,除非这个app极其简单
当app中有多个控制器的时候,我们就需要对这些控制器进行管理
有多个view时,可以用一个大的view去管理1个或者多个小view
控制器也是如此,用1个控制器去管理其他多个控制器
比如,用一个控制器A去管理3个控制器B、C、D
控制器A被称为控制器B、C、D的“父控制器”
控制器B、C、D的被称为控制器A的“子控制器”
为了便于管理控制器,iOS提供了2个比较特殊的控制器
UINavigationController
UITabBarController
50.UINavigationController的使用步骤
初始化UINavigationController
设置UIWindow的rootViewController为UINavigationController
根据具体情况,通过push方法添加对应个数的子控制器
41-50(UIApplication和delegate,UIApplicationMain,UIWindow,程序启动的完整过程,控制器view的延迟加载),布布扣,bubuko.com