1. 协议传值:
1:
指定协议
2:
定一个代理人对象属性
,
只有实现了上面定义的协议方法的对象,才能成为第二个页面的代理人
3:
让自己的代理人(
delegate
)去执行协议方法
4:
签订协议
5
:
把自己设置为第二个页面的代理人
6
:
实现方法
UI协议常用的单词 will did should
使用系统的协议
1
、签订协议
:UIAlertViewDelegate
2
、指定代理人
:
一般来说是
self
3
、实现协议方法
2.StroyBoard属性传值
StoryBoard----注意事项
初始化在下面的方法里写
-(
void
)awakeFromNib
{
}
第一步:
在故事板中点击右图所示的两个viewcontroller之间的小按钮segue
第二步:
在右侧设置
segue的
identifier
第三步:
在下面的方法中实现传值。
{
// 在导航控制器推出一个新的控制器之前 调用这个方法
NSLog ( @"segue name:%@" , segue. identifier );
if ([segue. identifier isEqualToString : @"bigCup" ]) {
// 获取下一个页面的对象
UIViewController *viewVC = segue. destinationViewController ;
viewVC. title = @"bigCup" ;
viewVC. view . backgroundColor = [ UIColor magentaColor ];
}
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
3.block传值
1.在第一个页面实现一个block,在第二个页面设置一个相同类型的block属性(如果一个block变量作为一个类的属性, 必须要使用copy修饰)
2.按照属性传值的方式把block给第二个页面
3.第二个页面在适合的适合调用block
为什么block作为属性要用copy
block1在全局区
如果在block的代码中,使用了block以外的变量,系统会把block指针转移到栈区。
使用copy属性赋值之后, block就会被系统转移到堆区。
堆区的内存是我们自己管理的,而栈区是系统管理的
//1. 无参无返回值
// 返回值类型 (^block 名称 ) ( 参数类型 参数名 ) = ^( 参数类型 参数名 ){};
void (^block1)( void ) = ^( void ){
NSLog ( @"aaa" );
};
//block 的调用 `
block1();
//2. 有参数无返回值
void (^block2)( int a, NSString *string) = ^( int a, NSString *string){
NSLog ( @"%d %@" , a, string);
};
block2( 6 , @"sb" );
//3. 无参有返回值
int (^block3)( void ) = ^( void ){
return 10 ;
};
int a = block3();
NSLog ( @"%d" , a);
//4. 有参有返回值
NSString *(^block4)( NSString *title) = ^( NSString *title){
return [title stringByAppendingString : @" sb" ];
};
NSLog ( @"%@" , block4( @"hehe" ));