0
点赞
收藏
分享

微信扫一扫

[原创]IOS中自定义协议和回调示例附源代码


我的实验步骤是创建带一个视图的项目,

默认的第一个视图的名称为ViewController

新建一个SecondViewController

 

第一步 在SecondViewController中声明一个协议,并写一个协议方法,然后在这个类中写一个属性,代码如下:

#import <UIKit/UIKit.h>

// MyDelegate Start
@protocol MyDelegate <NSObject>

- (void)showMessage; //协议方法

@end
// MyDelegate End

@interface SecondViewController : UIViewController

@property(nonatomic, weak)id<MyDelegate> delegate; // 此对象的一个属性

@end

 

第二步 在SecondViewController.m中写一下delegate这个属性的set方法 ,然后在set方法 里面去实现调用协议中的方法,代码如下:

#import "SecondViewController.h"

@interface SecondViewController ()

@end

@implementation SecondViewController

// delegate 的 set 方法
- (void)setDelegate:(id<MyDelegate>)delegate{
NSLog(@"delegate = %@", delegate);
NSLog(@"_delegate = %@", _delegate);

// _delegate = delegate; // 直接给_delegate赋值,最好用下面三行代替,判断一下是否相同,只有在两个对象不相同的时候才赋值
if (_delegate != delegate) {
_delegate = delegate;
}

//此处回调一下,到这里就完,这里相当于调用了实现该协议的那个对象的方法,称为回调,系统里面有TableView等等,这是IOS中的一个经典的设计模式,所以今天搞懂了一下
[self.delegate showMessage];
}

@end

 

第三步 在ViewController中声明实现 MyDelegate这个协议,代码如下:

#import <UIKit/UIKit.h>
#import "SecondViewController.h"

@interface ViewController : UIViewController<MyDelegate> // 此类实现 MyDelegate 协议

@end

 

第四步 创建SecondViewController对象,给对象的delegate赋值

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

SecondViewController *svc = [[SecondViewController alloc]initWithNibName:@"SecondViewController" bundle:nil]; // 创建SecondViewController
svc.delegate = self; // 设置 SecondViewController 的代理属性为当前对象,这里是给 svc的delegate属性赋值,会自动执行 svc中的setDelegate方法,然后我们在 svc里面写上一个setDelegate方法,里面实现回调
}

- (void)showMessage{
NSLog(@"I execute delegate");
}

@end

 

举报

相关推荐

0 条评论