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的延迟加载),,5-wow.com

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