iOS传值的几种方式
1.代理 一对一
在第二个页面设置代理
1.1在最上方设置
//选择房间的代理
@protocol RoomVCDelegate <NSObject>
1.2设置代理方法
//方法
-(void)selectRoomName:(NSString *)name;
1.3定义委托对象
@property (nonatomic,assign)id<RoomVCDelegate>delegate;
在第一个页面(添加代理方法)
需要设置 代理对象
self.delegate= self;
调用代理方法 把传值对象赋值
-(void)selectRoomName:(NSString *)name{
最后就是把要传的值(在第二个界面调用 )
[_delegateselectRoomName:@"木四滴"];
2.block块 一对一(优点 高效快速)
@property (nonatomic,copy)void (^backValues)(NSString *str);
在第二个页面定义完后 把值付给block方法
self.backValues(@"bug简");
在第一个页面 获取到第二个页面的对象 这个时候就只能用self获取 第一个页面的ui控件Vc.backValues=^(NSString *str){
[self.buttonsetTitle:strforState:UIControlStateNormal];
};
使用block是应注意以下几个方面 以下几个例子
__block是用空间的 因为是异步的必须用__block
__blockUIImage *image1 =nil;
//__weak避免循环引用
__weakViewController *weakSelf =self;
dispatch_group_async(group, groupT, ^{
image1 = [weakSelf downloadImage:@"http://a.hiphotos.baidu.com/image/pic/item/8644ebf81a4c510f19c75c136259252dd42aa5bc.jpg"];
});
__blockUIImage *image2 =nil;
__weakViewController *weakSelf2 =self;
dispatch_group_async(group, groupT, ^{
image2 = [weakSelf2 downloadImage:@"http://a.hiphotos.baidu.com/image/pic/item/8644ebf81a4c510f19c75c136259252dd42aa5bc.jpg"];
});
//主线程就不需要用__block
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
_image1.image = image1;
_image2.image = image2;
});
第二种第一方式
typedef void(^Block) (int,NSString*);
@property (nonatomic,assign)Block block;
这里两个需要连起来使用通知 一对多
//添加一个响应者 通知中心 最后一个参数具体对象或者nil 是这一类对象发生改变就会改变
[[ NSNotificationCenterdefaultCenter]addObserver:selfselector:@selector(textChange:)name:UITextFieldTextDidChangeNotificationobject:textField];}];
object 响应者
////移除通知中心
[[NSNotificationCenterdefaultCenter]removeObserver:selfname:UITextFieldTextDidChangeNotificationobject:alert.textFields.firstObject];
4.正向传值(比较简单不在详细举例)
5.storyboard 传值 利用segue
5.1在storyboard 建立连线器
5.2在segue设置标识
5.3根据segue找到相应的连线器
在 这个方法中
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
比如在第二个界面需要接数据以一个全局的model模型
传过去的是一个model模型
if ([segue.identifier isEqualToString:@"one"]) {
menuModel *model = [_rowArray[_currentSection]objectAtIndex:_selectRow];
detailViewController *Vc = segue.destinationViewController;
Vc.model = model;
}else if ([segue.identifier isEqualToString:@"two"]){
menuModel *model = [_rowArray[_currentSection]objectAtIndex:_selectRow];
detailViewController *Vc = segue.destinationViewController;
Vc.model = model;
}
}
直接在第二个界面 用model模型去赋值