博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
delegate代理设计模式
阅读量:7050 次
发布时间:2019-06-28

本文共 2383 字,大约阅读时间需要 7 分钟。

代理设计模式,功能跟addTarget/action比较像但是也有一些不同:

 

先在AppDelegate.m中写入navigation,(用于push到下一个页面,模态也可以)

#import "AppDelegate.h"

#import "ViewController.h"
@interface AppDelegate ()
@end
@implementation AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    
    
    self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    ViewController *viewVC = [[ViewController alloc] init];
    
    
    UINavigationController *naviVC = [[UINavigationController alloc] initWithRootViewController:viewVC];
    
    self.window.rootViewController = naviVC;
    
    
    return YES;
}

 

再建立一个SecondViewController

在SecondViewController.h中

#import <UIKit/UIKit.h>

//第一步:实现一个代理协议
@protocol SecondViewControllerDelegate <NSObject>
// 第二步:定义代理方法
- (void)passValueToViewController:(NSString *)passValue;
@end
@interface SecondViewController : UIViewController
// 第三步:声明代理人的属性
// 代理人的属性一定要用assign修饰,防止的是父类对象作为子类对象代理人的时候引起的循环引用,造成内存泄漏
// id<SecondViewControllerDelegate> 代表的是一个遵守了SecondViewControllerDelegate协议的泛型指针
@property (nonatomic, assign) id<SecondViewControllerDelegate> delegate;
@end

接着在ViewController.m中

#import "ViewController.h"

#import "SecondViewController.h"
//第四步: 遵守代理协议
@interface ViewController ()<SecondViewControllerDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
  
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    SecondViewController *secondVC = [[SecondViewController alloc] init];
    // 第五步:指定“我自己(ViewController类)”为secondVC的代理人
    secondVC.delegate = self;
    [self.navigationController pushViewController:secondVC animated:YES];
}
// 第六步:实现代理方法
- (void)passValueToViewController:(NSString *)passValue
{
    // 第七步:使用传递过来的值
    self.title = passValue;
    NSLog(@"passValue ===== %@", passValue);
}

最后在SecondViewController.m中

#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)viewDidLoad {
    [super viewDidLoad];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 第八步: 首先判断代理人是否存在,其次判断代理人是否实现了代理方法,如果都做了,就让代理人去执行代理方法
    if (self.delegate && [self.delegate respondsToSelector:@selector(passValueToViewController:)]) {
        // 第九步:让代理人执行代理方法,并传递参数
        [self.delegate passValueToViewController:@"你好"];
    }
}

 

转载于:https://www.cnblogs.com/Coder-GT/p/4869918.html

你可能感兴趣的文章
远程桌面如何复制本地文件 远程桌面拷贝电脑上的文件方法
查看>>
[转]解决JS浮点数(小数)计算加减乘除的BUG
查看>>
ASP.NET MVC应用程序的安全性介绍总括(高级编程)
查看>>
记录下,我们平时开发当中不得不知道的HTTP状态码
查看>>
HDU-1045 Fire NetFire Net 最大团
查看>>
Eclipse自动部署项目到Tomcat的webapps下的有效方法
查看>>
Extjs4快速上手三——实现主界面
查看>>
如何替代Flex?
查看>>
控制属性修改时间,控制时间,联合主键
查看>>
android-包签名
查看>>
Android开发和调试必备工具-SDK Tools
查看>>
《微软的软件测试之道》读书笔记 之 结构测试技术
查看>>
ASP.NET中Session的个人浅谈
查看>>
Ubuntu离线安装Sogou拼音(附老版本安装&输入法自启动)
查看>>
AS3学习笔记(三)XML解析
查看>>
cisco asa 5520 8.4 (二) -- 动态nat
查看>>
java.io.NotSerializableException
查看>>
php中instanceof的作用
查看>>
启用客服qq的方法
查看>>
Mac OS X Lion 10.7.3 发布
查看>>