天天看点

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

  那么来看看我们程序员的爱情吧!

  爱情就是死循环,一旦执行就陷进去了。

  爱上一个人,就是内存泄露你永远释放不了。

  真正爱上一个人的时候,那就是常量限定,永远不会改变。

  女朋友就是私有变量,只有我这个类才能调用。

  情人就是指针,用的时候一定要注意,要不然就带来巨大的灾难。

}

在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的代理

  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行

  1.常见属性

  @property (nonatomic)

UIDatePickerMode datePickerMode;// datePicker的显示模式

  @property

(nonatomic, retain) NSLocale *locale;// 显示的区域语言

  2.监听UIDatePicker的选择

  *

因为UIDatePicker继承自UIControl,所以通过addTarget:...监听

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

* 显示窗口

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函数才返回

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中)

sharedApplication].keyWindow

用来接收键盘以及非触摸类的消息事件的UIWindow,

而且程序中每个时刻只能有一个UIWindow是keyWindow。

如果某个UIWindow内部的文本框不能输入文字,

可能是因为这个UIWindow不是keyWindow

view.window//获得某个UIView所在的UIWindow

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];

控制器的view是延迟加载的:用到时再加载

可以用isViewLoaded方法判断一个UIViewController的view是否已经被加载

控制器的view加载完毕就会调用viewDidLoad方法

一个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

初始化UINavigationController

设置UIWindow的rootViewController为UINavigationController

根据具体情况,通过push方法添加对应个数的子控制器