OC和Swift中delegate与block的反向传值
2017-05-27 本文已影响108人
乡水情缘
对于初学者来说delegate或block都不是一下子能理解的,所以我的建议和体会就是,理不理解咱先不说,我先把这个格式记住,对就是格式,delegate或block都是高度格式化的,用的多了自然而然不理解也就理解了
场景:从 B -> A 传值,开发中必不可少的业务需求,经常会有在B页面干完一些事情之后告诉A页面或者传值到A页面。
本文主要简单说明一OC和Swift 中的 delegate和block
1.block的书写对比
2.delagete的书写对比
第一个问题:block的使用(oc的代码的1和2是写在.h中的)
1.首先在B的controller中声明
//swift
typealias TestBlock = (String,String)->Void
//oc
typedef void (^block)(NSString *str1,NSString *str2);
2.在B的controller中定义这个block
//swift
var block: TestBlock?
//oc
@property (copy, nonatomic) block bolck;
3.在B的controller里面调用这个block
//swift
self.block!("我是第一个参数","我是第二个参数");
//oc
self.bolck(@"第一个参数", @"第二个参数");
4.在A的controller里面监测B中block传递的值
//swift
let vc = SecondViewController();
vc.block = {
(str1: String,str2:String) -> Void in
print(str1+str2)
}
//oc
vc.bolck = ^(NSString *str1,NSString *str2){
NSLog(@"%@==%@",str1,str2);
};
第二个问题:delegate 的使用
1.首先在B的controller中定义一个协议
//swift
protocol TestDelaget {
func testDelagetMethod(str:String) ->Void
}
//oc
@protocol ViewControllerDelagete
@optional
- (void)testDelagete:(NSString *)str;
@end
2.在B的controller中声明这个delegate
//swift
var delegate: TestDelaget?
//oc
@property (assign, nonatomic) id delagete;
3.在B的controller中调用
//swift
self.delegate?.testDelagetMethod(str: "这个代理传递的值");
//oc
if ([self.delagete respondsToSelector:@selector(testDelagete:)]) {
[self.delagete testDelagete:@"我是代理传递的值"];
}
3.在A的controller中实现方法(别忘了设置代理)
//swift
func testDelagetMethod(str: String) {
print("test delegate---\(str)")
}
//oc
- (void)testDelagete:(NSString *)str{
NSLog(@"%@",str);
}
注:
1.swift 的demo下载地址:https://github.com/xiaoshunliang/SwiftTestBlock
2.OC的demo下载地址https://github.com/xiaoshunliang/OcTestBlock
想了解更多适合新手的内容可以关注下面的团队号(名字都是浮云,内容才是重点)