美文网首页
Delegate - protocol协议及委托代理(Deleg

Delegate - protocol协议及委托代理(Deleg

作者: lionsom_lin | 来源:发表于2018-01-25 16:56 被阅读28次

    参考文档

    Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替。
    协议是多个类共享的一个方法列表,在协议中所列出的方法没有响应的实现,由其它人来实现。

    一、Protocol 给类加共享的属性

    @protocol AppConfigData <UXYinjectioProtocol>
    @property (nonatomic, strong) NSString *version;
    @end
    
    @interface AppConfig : NSObject <AppConfigData>
    @end
    
    {
        AppConfig *config = [[AppConfig alloc] init];
        [config bindInjectioWithSuiteName:@"user1"];
        config.version = @"1.1";
    }
    
    {
        AppConfig *config = [[AppConfig alloc] init];
        [config bindInjectioWithSuiteName:@"user1"];
        NSLog(@"config\n");
        NSLog(@"%@\n", config.version);
    }
    
    @protocol PeopleData <UXYinjectioProtocol>
    @property (nonatomic, assign) float height2;
    @property (nonatomic, assign) int age3;
    @property (nonatomic ,assign) BOOL isAlive;
    @property (nonatomic, copy) NSString *name;
    @end
    
    @protocol ManData <UXYinjectioProtocol>
    @property (nonatomic, strong) NSArray *nicknames;
    @property (nonatomic, strong) NSDictionary *books;
    @end
    
    @interface Man : NSObject <ManData, PeopleData>
    @end
    
    {
        People *people = [[People alloc] init];
        [people bindInjectioWithSuiteName:@"bill"];
        people.name = @"name";
    
        Man *man = [[Man alloc] init];
        [man bindInjectioWithSuiteName:@"bill"];
        NSLog(@"%@\n", man.name);
    }
    
        AppConfig *config = [[AppConfig alloc] init];
        [config bindInjectioWithSuiteName:@"user1"];
        config.version = @"1.1";
    
        config = [[AppConfig alloc] init];
        [config bindInjectioWithSuiteName:@"user2"];
        config.version = @"1.2";
    

    二、protocol协议及委托代理(Delegate)的应用

    一般的委托者需要做的事:

    1、创建协议(也就是代理要实现的方法)
    2、声明委托变量
    3、设置代理(也可以在代理中设置)
    4、利用委托变量来调用协议方法(也就是让代理者开始执行协议)

    代理需要做的事:

    1、遵循协议
    2、实现协议方法

    具体代码实现

    1、协议的声明

    我们需要用协议来申明哪些方法是被委托出去了.

    @protocol  MyUIViewDelegate <NSObject>
    - (void)func;
    @end
    
    2、委托者申明一个属性

    委托者里得有一个属性代表被委托者, 注意这个属性是弱引用.

    @interface  MyUIView: UIView
    @property(nonatomic, weak) id<MyUIViewDelegate> delegate; 
    
    3、被委托者声明实现了协议

    被委托者需要声明自己实现了委托里的协议.

    @interface MyUIViewController : UIViewController <MyUIViewDelegate>
    @end
    
    4、设置委托

    在被委托者里设置自己是委托者的被委托者.嘛,这句话是有些绕.

    // viewcontroller. m中
    - (id)init
    {
        MyUIView *myView = [[MyUIView alloc] init];  //对MyUIView进行初始化
        myView.delegate = self;   // 将MyUIViewController自己的实例作为委托对象
        self.view = myView; 
    }
    
    5、委托事件

    在委托者里调用委托的方法.

    // MyUIView.m中
    - (void)doSomething
    {
        [self.delegate func];  
    }
    

    相关文章

      网友评论

          本文标题:Delegate - protocol协议及委托代理(Deleg

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