【iOS基础控件 - 14】 控制器 && 控制器的view

A.控制器的创建

控制器常见的创建方式有以下几种
通过storyboard创建

直接创建

1 ViewController *vc = [[ViewController alloc] init];

xib设置了class后,当xib的文件名跟controller类名一样的时候,用这个方法默认就会加载xib中的controller

指定xib文件来创建

1 ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

 

1.从storyboard中创建

(1)创建一个Empty Application (不带storyboard)

(2)创建window并加到screen上

1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
2     // 手动添加window到screen
3     self.window = [[UIWindow alloc] init];
4     self.window.frame = [[UIScreen mainScreen] bounds];
5     self.window.backgroundColor = [UIColor grayColor];
6     [self.window makeKeyAndVisible];
7     return YES;
8 }

(3)创建一个storyboard,拖入一个controller

(4)取出storyboard(其实就是相当于xib)

1     // 2.取得stroyboard
2     UIStoryboard *sb = [UIStoryboard storyboardWithName:@"mysb" bundle:nil];

(5)设置storyboard上controller为rootViewController

有两种方式取得storyboard上的controller

a.直接使用入口controller,这个view的背景色是橄榄绿

设置storyboard中的ViewController的class为自定义的controller

1     // 3.1直接使用InitialViewController
2     self.window.rootViewController = [sb instantiateInitialViewController];

b.使用ID

设置ViewController的class

再拖入一个ViewController,设置view的背景色是黄色,设置ID是”vc2"

1     // 4.使用ID取得controller, 设置rootViewController
2     self.window.rootViewController = [sb instantiateViewControllerWithIdentifier:@"vc2"];

完成的加载过程:

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     // 1.手动添加window到screen
 3     self.window = [[UIWindow alloc] init];
 4     self.window.frame = [[UIScreen mainScreen] bounds];
 5     self.window.backgroundColor = [UIColor grayColor];
 6     [self.window makeKeyAndVisible];
 7
 8     // 2.取得stroyboard
 9     UIStoryboard *sb = [UIStoryboard storyboardWithName:@"mysb" bundle:nil];
10
11     // 3.取出storyboar中的controller
12     // 3.1直接使用InitialViewController
13     ViewController *controller = [sb instantiateInitialViewController];
14
15     // 3.2使用ID
16     ViewController2 *controller2 = [sb instantiateViewControllerWithIdentifier:@"vc2"];
17
18     // 4.设置rootViewController
19     self.window.rootViewController = controller2;
20
21     return YES;
22 }

总结:

1.创建Single View Application的时候,项目会自带一个storyboard,其实就是做了上面的事情

设置了Main storyboard 的文件,就会自动加载storyboard

2.不同的controller类负责不同的界面的操作

2.直接创建

(不详述)

3.指定xib文件创建

在之前没有storyboard的时候使用这种方法

(1)创建一个controller

(2)创建一个xib

(3)在xib拖入两个view,设置一些特征标识,方便对比

(4)设置其中一个view为控制器的view

a.更改 File’s Owner 的class为自定义的controller

b.设置controller的view

(5)从xib加载controller,并把view显示到window上

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     // 1.手动添加window到screen
 3     self.window = [[UIWindow alloc] init];
 4     self.window.frame = [[UIScreen mainScreen] bounds];
 5     self.window.backgroundColor = [UIColor grayColor];
 6     [self.window makeKeyAndVisible];
 7
 8     // 从xib加载控制器, 设置rootViewController
 9     self.window.rootViewController = [[XibViewController alloc] initWithNibName:@"myx" bundle:nil];
10
11     return YES;
12 }

总结:

1.storyboard:(这里使用ViewController2为rootViewController)

xib:(使用view1作为显示的view)

B.创建控制器的view

控制器的view创建有多种方式,(按照优先级进行创建,仅使用最优先的方式)

  • loadView代码(controller实现loadView方法)
  • storyboard描述
  • xib

最新版的官方文档:

1.通过loadView

(1)创建一个controller、storyboard、xib

(2)配置好storyboard和xib的class为自定义的controller

(3)给storyboard和xib的view加上明显的标志

(4)在controller类中实现loadView(当controller的view是空的时候,就会调用loadView

 1 // 加载view,这是延迟加载,当需要使用view而view是空的时候调用
 2 - (void)loadView {
 3     NSLog(@"loadView...");
 4     self.view = [[UIView alloc] init];
 5     self.view.frame = [[UIScreen mainScreen] bounds];
 6     UILabel *label = [[UILabel alloc] init];
 7     label.frame = CGRectMake(40, 40, 100, 100);
 8     label.text = @"loadView";
 9     [self.view addSubview:label];
10 }

(5)在delegate中配置controller到window上

a.配置storyboard的controller为rootViewController

 1 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 2     // 配置window
 3     self.window = [[UIWindow alloc] init];
 4     self.window.frame = [[UIScreen mainScreen] bounds];
 5     self.window.backgroundColor = [UIColor grayColor];
 6
 7     // 配置storyboard中的controller为rootViewController
 8     self.window.rootViewController = [[UIStoryboard storyboardWithName:@"test" bundle:nil] instantiateInitialViewController];
 9
10      // 配置xib中的controller为rootViewController,主要要使用带有loadView的controller
11 //    self.window.rootViewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
12
13     // 显示window
14     [self.window makeKeyAndVisible];
15     return YES;
16 }
17  

会发现没有起作用

b.同样,使用xib中的controller为rootViewController,只要loadView存在,也不会起作用

1      // 配置xib中的controller为rootViewController,主要要使用带有loadView的controller
2     self.window.rootViewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];

总结:

在配置rootViewController的时候,如果配置的controller中实现了loadView方法,就会覆盖storyboard或xib中的view

时间: 2024-10-14 07:40:50

【iOS基础控件 - 14】 控制器 && 控制器的view的相关文章

[iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表"练习)

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

ios基础控件之开关按钮(UISwitch)

UISwitch控件是iOS开发的基础控件,是非常简单的一个控件,因为它的方法比较少.UISwitch继承于UIControl基类,因此可以当成活动控件使用. 注意:开关状态通过它的on属性进行读取,该属性是一个BOOL属性 创建: UISwitch* mySwitch = [[ UISwitch alloc]initWithFrame:CGRectMake(0.150.0f,100.0f,0.0f,0.0f)]; 可能你会疑问为什么它的大小都设置为0?没错,它的大小你设置是无效的,系统会为你分

[iOS基础控件 - 5.2] 查看大图、缩放图片代码(UIScrollView制作)

原图: 900 x 1305   拖曳滚动: 缩放:       主要代码: 1 // 2 // ViewController.m 3 // ImageZoom 4 // 5 // Created by hellovoidworld on 14/11/28. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 11 @interface

[iOS基础控件 - 6.11.3] 私人通讯录Demo 控制器的数据传递、存储

A.需求 1.搭建一个“私人通讯录”Demo 2.模拟登陆界面 账号 密码 记住密码开关 自动登陆开关 登陆按钮 3.退出注销 4.增删改查 5.恢复数据(取消修改) B.基本架构 1. 5个控制器 (1)导航控制器 NavigationController (2)登陆 UIViewController 输入账号密码 记住密码.自动登录开关 登陆跳转按钮 (3)联系人列表 TableViewController 注销功能 添加联系人跳转按钮 (4)添加联系人 UIView (5)查看.编辑 UI

[iOS基础控件 - 6.12.1] QQ菜单管理 UITabBarController 控制器管理

A.需求 1.类似QQ.微信顶部或者底部的窗口转换导航条 2.给每个页面添加相应内容 B.UITabBarController 1.基本概念: (1)内容高度 iOS7之前内容高度为:屏幕高度 - 状态栏高度44 - 底部导航条高度49 iOS7及之后,内容高度为整个屏幕 2.使用代码创建初始化 (1)创建一个UITabBarController UITabBarController的使用步骤 初始化UITabBarController 设置UIWindow的rootViewController

【iOS基础控件 15 - 2 】 UITabBarController 控制器管理

A.需求 1.类似QQ.微信顶部或者底部的窗口转换导航条 2.给每个页面添加相应内容 B.UITabBarController 1.基本概念: (1)内容高度 iOS7之前内容高度为:屏幕高度 - 状态栏高度44 - 底部导航条高度49 iOS7及之后,内容高度为整个屏幕 2.使用代码创建初始化 (1)创建一个UITabBarController UITabBarController的使用步骤 初始化UITabBarController 设置UIWindow的rootViewController

iOS 基础控件(下)

上篇介绍了UIButton.UILabel.UIImageView和UITextField,这篇就简短一点介绍UIScrollView和UIAlertView. UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的尺寸超出了屏幕范围之后,用ScrollView则可以通过滚动的方式使得超出屏幕的那部分内容通过滚动的方式显示出来,在Android里面有水平的ScrollView和垂直的ScrollView,在iOS里面就只有一个S

[iOS基础控件 - 6.9] 聊天界面Demo

A.需求 做出一个类似于QQ.微信的聊天界面 1.每个cell包含发送时间.发送人(头像).发送信息 2.使用对方头像放在左边,我方头像在右边 3.对方信息使用白色背景对话框,我方信息使用蓝色背景对话框 4.隐藏相同的发送时间 5.底部功能按钮:语音按钮.消息输入框.表情按钮.附加按钮 6.响应键盘事件,呼出键盘.隐藏键盘时对上述的视图作出上移操作 7.键盘的发送事件处理 B.实现点 1.底层视图搭建 上部分聊天信息框:UITableView 下部分功能区:UIButton 信息输入框使用无边框