1.使用代理和gcd block方式实现子view里控件的值到父viewcontroller里传值使用
一、代理的方式
1)在子view.h中声明代理的方法名
@protocol OnlineHDoctorDetailHeaderViewDelegate
- (void)searchBegin:(UITextField *textField);
@end
2)在view.m里实现这个代理
[self.idelegate searchBegin:textField];
3)在父viewcontroll中添加代理<OnlineHDoctorDetailHeaderViewDelegate>
- (void)searchBegin:(UITextField *textField)
{
//使用自view里的值 实现相关操作
}
二、block方式
1)在子view.h里定义一个类型 typedef void(^searchNavViewBlock)(UITextField *textField);
2)在子view.h里定义一个回调函数 block类型属性
@property (nonatomic, copy) searchNavViewBlock searchBeginBlock;
3)在子view.m里实现block
-(BOOL)textFieldShouldReturn:(UITextField *)textField {
if (self.searchBeginBlock) {
self.searchBeginBlock(textField);
}
[self.textField resignFirstResponder];
return YES;
}
4)在父viewcontroller里调用这个block
[self.navView setSearchBeginBlock:^(UITextField *textField) {
if (!NULLString(textField.text)) {
[ws saveHistoryDataWithKey:textField.text];
[ws searchRequestDataWithCurrentKey:textField.text
pageIndex:0
success:nil
failure:nil];
}
[ws.navView.textField resignFirstResponder];
}];
通常我写一个不带参数的块回调函数是这样写的
在 . h 头文件中
定义类型
typedef void (^leftBlockAction)();
在定义一个回调函数
-(void)leftButtonAction:(leftBlockAction)leftBlock;
在.m 文件中
-(void)leftButtonAction:(leftBlockAction)leftBlock{
leftBlock();
}
今天学会一个高大上的方法
只要在.h 头文件定义属性方法
@property (nonatomic,copy) dispatch_block_t leftBlockAction;
在.m文件 调用的方法里调用
if (self.leftBlockAction) {
self.leftBlockAction();
}
在另个模块里直接
MyAlertView *alert = [[MyAlertView alloc]init];
alert.leftBlockAction = ^() {
NSLog(@"left button clicked");
};
是不是对第一种方法简单了很多
你要知道你的回调是一个什么性质的回调,如果这个回调是一个不定期触发,或者会多次触发的,那么 Delegation 应该更适合;如果这个回调是一个一次性的,并且和调用方法是单线性关系的,那么 Block 应该更适合;如果这个回调是广播性质的,需要很多个不同的类都接收到,那么 NSNotification 更适合。
说到这个问题其实还应该加上notification,以下做一下这三者之间的对比:1.delegate(1)特点:一对一;(2)适用场景:UI响应事件,回调方法(网络请求)(3)优点 a. 较为清晰的语法定义,减少维护成本; b. 不需要三方监听和传输数据;(4)缺点 a. 书写麻烦,要定义多个协议; b. 多个对象间通信时不太实用;2. block(1)特点:一对一;(2)适用场景:回调方法(网络请求)(3)优点 a. 书写简单; b. 易读,易维护;3. notifications(1)特点:一对多;(2)适用场景:跨层/功能通信,减小耦合;(3)优点 a. 代码简单; b. 解决多对象之间的监听问题;(4)缺点 a. 轮询机制耗资源; b. 不易维护; c. 需要第三方对象来作为监听和被监听的对象; d. dealloc中需要removenotification。
作者:Mr Killer
链接:https://www.zhihu.com/question/29023547/answer/129108189
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
作者:Bill Cheng
链接:https://www.zhihu.com/question/29023547/answer/110199052
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。