1.传值的方向性
如果从A界面跳转到B界面并传值,正向传值。
如果从B界面返回到A界面并传值,反向传值。
2.反向传值
VC1:
2>在VC1跳转VC2前,将自己赋值给VC2的属性。
3>在VC1声明一个属性,用来接收传值。(model)
5>重写了viewWillApear方法(每次界面显现的时候执行),将model的值->view(label)
VC2:
1>首先要保存前一个界面的引用(属性)
4>触发返回上一个界面方法时,将VC2值传给VC1的Model。
传值方式:
属性
方法
委托模式
"委托模式"传值方式:
1.定义一个委托协议—(1)
传值方式:属性/方法—(2)
2.委托方—(3)
创建一个属性关联被委托式(delegate)—(4)
反回前一个界面前,得到委托方的值—(9)
(textFieldvalue)->self.delegate.value = textFieldValue
3.被委托方—(5)
遵守协议—(6)
实现协议要求的属性和方法—(7)
接收到值后,将值显示在界面上—(10)
viewDidAppear -> self.myLabel.text = self.value;
4.将委托方与被委托方关联一起 —(8)
在VC3->VC2之前,vc2.delegate = self;
补充:
声明属性时候的关键字:
assign 基本数据类型,默认assign
weak(MRC assign)
修饰对象的引用,仅仅是指向对象,不会通知对象的引用计数器加1。如果指向的对象销毁了,那么该引用会自动置空。
strong(MRC retain)
修饰对象的引用,当该引用指向对象的时候,会通知引用计数器加1 。
copy
修饰对象的引用,但是会将原有的对象内容复制一份,并得到新的内存地址。
*NSCopying 对象的复制 深复制(深拷贝)
NSString *str = [NSString alloc]init…"hello"];
NSString *str2 = [str copy];
引用复制 浅复制(浅拷贝)
NSString *str = [NSString alloc]init…"hello"];
NSString *str2 = str;
int i = 10;赋值
int *p = &i;赋值(传地址)
copy
修饰对象的引用,但是会将原有的对象内容赋值一份,并得到新的内存地址。
NSCopying 对象的赋值 深拷贝(开辟新的内存地址)
引用的赋值 浅拷贝(内存地址一样)
char str[] = {’s’,’t’,’r’,’\0’};//可以修改
char *str2 = "str";//不可修改
char *str3 = "str";
4.UINavigationController(导航控制器)
4.1 是什么
是控制器UIViewController的子类,本质是一个视图控制器的控制器,是用来管理其他VC的VC。(用来管理其他的视图管理器)
4.2 有什么用
管理和控制VC的走向,比present方式更好、更清晰。
4.3 怎么用
1)创建一个UINavigationController的对象或*其子对象。并且要指定一个根视图控制器。
2)推出一个界面(VC)界面跳转
self.navigationContriller push VC2
3)返回前一个界面
a.会自动生成一个返回方式
b.指定一个事件方法返回
[self.navgaitionContriller popViewController];
4.4 内部原理
1)navi..内部维护着一个VC对象的数组
self.navigationControllers.viewControllers
将此数组当做栈来管理
栈是一种数据结构,特点是先进后出,后进先出。
2)navi必须有一个根VC,第一个被navi包含的VC。
3)push一个新界面(VC),旧的VC是不会被释放的。
4)navi会保持所有push进去的VC的引用,push一个vc其实是此VC放入到navi中的数组中。
5)当pop一个VC从navi中出来时,此vc就会被释放。
6)不能pop根VC
4.5 使用方式
传值:原理同上(present)。重构传值练习。(正、反向)
1)NavigationBar(导航栏)
导航栏分别认为三个部分,分别是左,中,右。
a.中 标题(Title默认为标题)
在具体的VC中,设置了一个属性self.title.(viewDidLoad)
当界面跳转时,默认的返回按钮,自动更新为上一个界面的标题。
b.左、右按钮
.navigationItem.leftBarButtonItem
.navigationItem.rightBarButtonItem
c.UIBarButtonItem
专门用于各种bar上的按钮,和UIButton不一样的系统按钮。
按钮的形式:
系统按钮
文字按钮
initWithTitle:style:target:action:
d.放多个按钮
.navigationItem.leftBarButtonItems…
.navigationItem.rightBarButtonItems…
e.隐藏当行控制器头
self.navigationController.navigationBarHidden = YES;
2)ToolsBar 工具栏
工具栏默认是隐藏的。
a.显示工具栏
self.navigationController.toolBarHidden = NO;
b.UIBarButtonItem
专门用于各种bar上的按钮,和UIButton不一样的系统按钮。
系统按钮
initWithBarButtonSystemItem:target:action:
文字按钮
initWithTitle:style:target:action:
c.向工具栏添加按钮
self.toolBarItem = @[……];
d.美工具栏的样式
Fixed:固定值
Fiexible:弹簧效果,尽可能的填补空间。
3)在一个NavigationController中,可以继续使用present,当然也可以使用NavigationController。
作业:
重构昨天的作业,***传值...
模拟文本创建器
界面1:有一个按钮:“创建一个文本”
当用户点击按钮后,跳转到第二个界面。
界面2:
x:[…] y:[…]
width:[…] height:[…]
text:[…]
确定按钮