美文网首页
问题:什么是 Protocol,Delegate ,一般是怎么用

问题:什么是 Protocol,Delegate ,一般是怎么用

作者: 姜小舟 | 来源:发表于2020-05-09 17:39 被阅读0次
    • 协议(protocol):就是使用了这个协议后就要按照这个协议来办事,协议要求实现的方法就一定要实现。
    • 代理(delegate):根据协议实现委托方需要完成的事,即实现协议中的方法。

    协议(protocol)、代理(delegate)常用见于代理模式。代理模式是一种消息传递方式,一个完整的代理模式包括:委托对象、代理对象和协议。
    代理模式一般情况下是用来跨对象传值的。

    情境描述:

    ViewControllerA跳转到ViewControllerB,当点击返回时需ViewControllerB 想ViewControllerA传递一个字符串"我是一个传值字符串",并由ViewControllerA进行NSLog打印。

    情景实现:

    • 1.ViewControllerB声明协议和协议方法
    -------------------------------------------------
    //  ViewControllerB.h
    
    #import <UIKit/UIKit.h>
    #1. 新建一个协议,协议的名字一般是由“类名+Delegate”
    @protocol ViewControllerBDelegate <NSObject>
    // 代理传值方法
    - (void)sendValue:(NSString *)value;
    @end
    
    @interface ViewControllerB : UIViewController
    #2. 委托代理人,代理一般需使用弱引用(weak)
    @property (weak, nonatomic) id<ViewControllerBDelegate> delegate;
    @end
    -------------------------------------------------
    //  ViewControllerB.m
    
    #import "ViewControllerB.h"
    
    @interface ViewControllerB ()
    @property (strong, nonatomic) IBOutlet UITextField *textField;
    @end
    
    @implementation ViewControllerB
    - (IBAction)backAction:(id)sender {
        if ([_delegate respondsToSelector:@selector(sendValue:)]) { // 如果协议响应了sendValue:方法
            [_delegate sendValue:@"我是一个传值字符串"]; // 通知执行协议方法
        }
        [self.navigationController popViewControllerAnimated:YES];
    }
    @end
    -------------------------------------------------
    
    • 2.ViewControllerA设置为ViewControllerB的代理,ViewControllerA遵循协议,并实现协议方法
    //ViewControllerA.m
    
    #import "ViewControllerA.h" 
    #import "ViewControllerB.h" 
    #4.遵循协议
    @interface ViewController() <ViewControllerBDelegate> 
    @end
    
    @implementation ViewControllerA 
    - (void)jumpTo ViewControllerB {
        ViewControllerB *vc = segue.destinationViewController;
        #3.设置代理
        [vc setDelegate:self];
        [self.navigationController pushViewController: vc animated:YES];
    }
     # 5.这里实现B控制器的协议方法
    - (void)sendValue:(NSString *)value {
        NSLog(@"%@", value);
    } 
    @end
    运行结果
    2020-01-04 10:32:34.288075+0800 DeleteDemo[2006:407016] 我是一个传值字符串
    

    相关文章

      网友评论

          本文标题:问题:什么是 Protocol,Delegate ,一般是怎么用

          本文链接:https://www.haomeiwen.com/subject/nrtknhtx.html