提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
属性传值
在页面一中定义一个对象,在页面二中赋值即可。
单例传值
单例传值需要有一个单例类,单例类中有类方法,在类方法中用静态变量保存一个需要传值的变量。
单例举例
interface DefaultInstance:NSObject
+(instancetype)sharedInstance;
@property (nonatomic,strong)NSString *str;
@end
@implementation DefaultInstance
+(instancetype) sharedInstance{
static DefaultInstance *sharedVC=nil;
if(sharedVC==nil){
sharedVC=[[DefaultInstance alloc] init];
}
return sharedVC;
}
这样在不同位置每次创建拿到DefaultInstance的str元素都是一样的。
代理传值
即delegate方法,委托方持有协议,调用协议方法,代理方遵守协议,实现协议方法即可接受传来的值。
委托方代码
//委托方创建协议
@protocol passValueDelegate <NSObject>
//协议定义传值方法
-(void) passValue:(NSString *)str;
@end
@interface NextViewController:
//定义一个持有协议的id指针
@property (weak)id<passValueDelegate> delegate;
@end
@implementation NextViewController
-(){
[self.delegate passValue:参数];//向代理发送消息
}
@end
代理方代码
//遵守协议
@interface ViewController ()<passValueDelegate>
@end
@implementation ViewController
-{
NextViewController *NVC=[[NextViewController alloc] init];
NVC.delegate=self;//指定自己为代理
}
-(void) passValue:(NSString *)str{
//在接受到消息时所执行的程序
}
@end
block传值
苹果最推荐最常见的传值方式
@interface NextViewController:
//定义block
//(copy防止循环引用),返回值类型 (^ block的名字)(可选参数)
@property (copy)void (^block)(NSString *);
@end
@implementation NextViewController
-(){
self.block(参数);
}
@end
@implementation ViewController
-{
NextViewController *NVC=[[NextViewController alloc] init];
NVC.block=^(NSString *str){
//执行语句
}
}
@end
通知传值
最容易实现跨页面传值(前面为直接调用传值)
接收方先监听,发送方发送后接受方就收到数据了。
接收方
@implementation ViewController
-{
NextViewController *NVC=[[NextViewController alloc] init];
//创建通知中心,将自己添加进监听者,选择接受通知后的处理函数,接受通知为notify,监听来自所有的消息(object为nil即为接收所有消息)
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(函数名:) name:@"notify" object:nil];
//使用时
}
-函数名:(NSNotification *)not{
self.str=not.userInfo[@""];//取字典中数据即可
}
@end
发送方
@implementation NextViewController
-(){
//发送通知
//发送的参数值必须是一个字典
[[NSNotifiicationCenter defaultCenter]postNotificationName:@"notify" object:nil userInfo:@{@"":@""}];
}
@end