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方法添加对应个数的子控制器

时间: 2024-10-21 18:35:48

41-50(UIApplication和delegate,UIApplicationMain,UIWindow,程序启动的完整过程,控制器view的延迟加载)的相关文章

五、程序启动的完整过程

程序启动的完整过程: 1.先执行main函数,main内部会调用UIApplicationMain函数,该函数的声明如下: int UIApplicationMain(int argc, char argv[], NSString principalClassName, NSString *delegateClassName). argc.argv:标准main函数的参数,直接传递给UIApplicationMain进行相关处理即可 principalClassName:指定应用程序类,该类必须

程序启动的完整过程

程序启动的完整过程 int main(int argc, char * argv[]) { @autoreleasepool { return UIApplicationMain(argc, argv, nil, NSStringFromClass([MJAppDelegate class])); } } 执行顺序 1.main函数 2.UIApplicationMain 创建UIApplication对象 创建UIApplication的delegate对象 3.开启主运行循环 3(1).de

UIPickerView/UIDatePicker/程序启动的完整过程

一.UIPickerView 1.UIPickerView的常见属性 数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id<UIPickerViewDataSource> dataSource; 代理(用来告诉UIPickerView每1列的每1行显示什么内容,监听UIPickerView的选择) @property(nonatomic,assign) id<UIPickerViewDelegate>   deleg

UIPickerView,程序启动的完整过程

一.UIPickerView1.UIPickerView的常见属性// 数据源(用来告诉UIPickerView有多少列多少行)@property(nonatomic,assign) id<UIPickerViewDataSource> dataSource;// 代理(用来告诉UIPickerView每1列的每1行显示什么内容,监听UIPickerView的选择)@property(nonatomic,assign) id<UIPickerViewDelegate>   dele

Objective - C 学习笔记:程序启动的完整过程

1. main函数 2. UIApplicationMain * 创建UIApplication对象 * 创建UIApplication的delegate对象 3.1 delegate代理开始处理(监听)系统事件  (没有storyboard) * 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法 * 在application:didFinishLaunchingWithOptions:中创建UIWindow * 创建和

iOS程序启动的完整过程

1.main函数 2.UIApplicationMain* 创建UIApplication对象* 创建UIApplication的delegate对象 3.delegate对象开始处理(监听)系统事件(没有storyboard)* 程序启动完毕的时候, 就会调用代理的application:didFinishLaunchingWithOptions:方法* 在application:didFinishLaunchingWithOptions:中创建UIWindow* 创建和设置UIWindow的

程序启动和运行过程

摘抄自:http://www.cnblogs.com/kenshincui/p/3890880.html#runProcess 程序的运行过程 在几乎所有的程序开发中程序一般都是从main函数开始运行的,那么IOS程序也不例外,在上图中我们可以看到Xcode为我们生成了一个main.m文件: // // main.m // FirstIOS // // Created by Kenshin Cui on 14-2-23. // Copyright (c) 2014年 Kenshin Cui. A

[iOS基础控件 - 6.10.7] UIWindow &amp; 程序启动过程

A.UIWindow概念 1.继承UIView,是一种特殊的UIView 2.通常一个APP只有一个UIWindow 3.iOS程序启动后,创建的第一个视图就是UIWindow 4.没有UIWindow,不能显示任何东西 B.使用 1.创建一个Empty Application项目 没有了storyboard,要手动实现UIWindow的创建代码(其实这就是storyboard做的事情) 1 // 手动创建UIWindow,并加到screen上 2 self.window = [[UIWindo

IOS 应用程序启动加载过程(从点击图标到界面显示)

今天帮同事解决问题的时候发现,造成程序BUG的原因是同事对程序的启动和试图的加载过程不熟悉.所以当局部代码没有问题,但是程序一运行却总不是我们想要结果的时候,我们应该想想是不是因为我们忽略了试图加载过程的原因.下面我们用一个例子来简单介绍一下启动过程中常见的几个方法.首先我们通过XIB 创建了一个试图控制器(名字叫Empty ,不要问我为为啥它叫这个名字,因为我太懒了,鼠标点快了就没去该),又创建了一个UIView的子类(MyView),并且将Empty的对象 设置为窗口的跟控制器,MyView