iOS几种传值方法的总结

来源:互联网 发布:海康网络球机接线图 编辑:程序博客网 时间:2024/06/03 14:58

1、初始化传值
初始化传值:初始化传值是最简单的传值方式,系统用到的有

initWithFrame:(CGRect),initWithImage:(UIImage *),initWithContentURL:(NSURL *)…

等,我们在初始化自定义对象的时候也可以使用这样的方式,

initWithString:(NSString *)myStringinitWithNSDictionary:(NSDictionary *)myData

将我们需要的数据传入新生成的类;

2、属性传值
属性传值:初始化传值方式只能在对象初始化的时候进行传值,那如果我们想修改对象里面的某些内容,就需要用到属性传值,比如我们要刷新一个表格视图,那我们只需要将数据源数组self.dataSourceArray重新赋值,然后用[myTableView reloadData];刷新视图即可;在使用属性传值的时候需要注意,如果我们把控件(UILabel)作为一个属性,那么必须要等到viewDidLoad加载完后再给Label.text赋值,如果我们只传数据需要在viewDidLoad执行前传过来;

3、方法参数传值
方法参数传值:与属性传值非常类似,实际上属性传值的就是在调用属性的self.datasourcearrayet方法,通过方法的参数将值传入对象;

前面三种传值方法都比较简单,而且都是由上一级页面传给下一级页面,或者由父视图传给子视图,那么如果我们反过来,该怎么传呢,以下几种方式将会解决我们的问题 。

4、协议传值
协议传值:在我们使用UIScrollView,UITableView,UITextField的时候通常会引入协议 ”UIScrollViewDelegate,UITableViewDataSource,UITableViewDelegate,UITextFieldDelegate“,这就是这些控件使用一个协议将我们需要的值或者操作传递给我们的当前视图(或者也可以说是父视图),只不过系统的实现我们是没有看到的。同样我们自己定义的视图或对象也可以采用这样的方式,自己定义一个协议,将操作或数据传给父视图:首先需要先定义一个协议,可以单独写一个文件也可以放到子类里面:如
@protocol LoginDelegate
- (void)loginSuccessWithID:(NSString *)userID;
@end
其次在子视图中创建一个属性或者变量
@property(nonatomic,assign)id loginDelegate;
第三步调用协议方法:
if ([self.loginDelegate respondsToSelector:@selector(loginSuccessWithID:)]) {
[self.loginDelegate loginSuccessWithID:@”1001”];
}
通过这三步就完成了系统隐藏起来的那部分代码,接下来我们在任何一个类中使用该视图的时候只要接受这个协议,设置委托为self自身,实现协议中的方法,从方法的参数中就取到了传送的数据了。

5、Block传值
iOS4以后开始支持block语句,这就为我们提供另外一种传值方式,通常情况下,可以使用block来代替协议,我们在使用AFNetworking库来做网络请求的时候会用到:
AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] init];
[manager POST:path parameters:formParams success:^(AFHTTPRequestOperation *operation, id responseObject) {
//在语句块内我们可以使用operation和responseObject这两个对象,这就是数据请求结束后通过block方式传回来的数据
};
我们也可以按照这样的形式去传递普通数据,如:在第二个页面声明一个语句块:
typedef void(^SendMessageBlock)(NSString *str);
声明一个块类型属性或变量:
@property(nonatomic,copy) SendMessageBlock send;
如果是属性我们可以在其他页面给语句块赋值,如果是变量需要在本页面赋值,也就是通过初始化传参赋值
需要传值的时候进行调用
if (self.send) {
self.send(@”用block传值”);
}
第一个页面就可以进行取值
LoginView *loginView = [[LoginView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];
loginView.send = ^(NSString *str){
NSLog(@”%@”,str); //用block传值
};
[self.view addSubview:loginView];

6、通知传值
通知传值:(NSNotificationCenter),这种消息通知机制可以应用于任意时间和任何对象,观察者可以有多个,所以消息具有广播的性质,只是需要注意的是,观察者向消息中心注册以后,在不需要接受消息时需要向消息中心注销,这种消息广播机制是典型的“Observer”模式,主要分三步实现:
CocoaLigature0 注册: [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getUserProfileSuccess:) name:@”Notification_GetUserProfileSuccess” object:nil];
//notificationObserver 观察者 : self
//notificationSelector 处理消息的方法名: getUserProfileSuccess
//notificationName 消息通知的名字: Notification_GetUserProfileSuccess
//notificationSender 消息发送者 : 表示接收哪个发送者的通知,如果第四个参数为nil,接收所有发送者的通知
发送:
[[NSNotificationCenter defaultCenter] postNotificationName:@”Notification_GetUserProfileSuccess” object:userProfile userInfo:dic];
//notificationName 消息通知的名字: Notification_GetUserProfileSuccess
//notificationSender 消息发送者: userProfile
移除:
-(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self]; //移除self的所有观察值
}
注意:自动管理内存也需要在dealloc里面移除
[[NSNotificationCenter defaultCenter] removeObserver:self name:@”Notification_GetUserProfileSuccess” object:nil]; //全部移除
最后实现注册通知时的回调方法即可
- (void) getUserProfileSuccess: (NSNotification*) aNotification
//NSNotification 接受到的消息信息,主要包含:
//Name: 消息名称 Notification_GetUserProfileSuccess
//object: 消息发送者 userProfile
//userInfo: 消息传递的数据信息

7、单例传值
单例传值:单例只会对某个类实例化一次/单例类,对单例这个类实例化一次有且仅有一个对象,在不同类中对该类进行操作就可以实现传值的目的;

8、数据存储
数据存储:数据存储就是将数据存储在文件或者数据库中,其他类就可以使用,系统为我们提供了一种快捷的存储方式:[NSUserDefaults standardUserDefaults] 其实这也是一种单类的形式,只不过是将数据存储在磁盘plist文件

9、extern全局变量
extern全局变量,设定有A类和B类两个类,在B类的实现文件前定义一个变量
NSString *bClassSring;
@implementation NewViewController{…}
如果想在A类中使用,只需要在A类的.m文件引入B类的头文件,在实现前定义:extern NSString *bClassSring;这样你会发现在两个类中使用的都是同一个变量,好像是两个类公共使用,所以也称为全局变量。

0 0
原创粉丝点击