iOS 学会使用delegate和block<一>

       毕业将近半年了,从事iOS开发也一年多了,入了iOS这个行列,算是一个明智之举吧,iOS开发带给我了很多欢乐,当然了,也给了我物质上很大的满足,今天我来给说一下自己对delegate和block的理解,说的不对的地方,希望大家指正。

     delegate和block我感觉是一样的,但是block比delegate使用的简单,而delegate比block理解起来简单,所以说,如果跟我一样是小白的话,那么就先好好学delegate, 懂了之后再往block上套,一定会理解透彻的,定义delegate尽量用weak,不用assign.警告:delegete是对象的代理方法,而不是类,所以定义或者使用代理都是在对象方法中用,在类方法中是没法用的

     所谓delegate,其实跟我们日常生活中的代理一样,日常生活中的代理是什么样呢,为了防止我们这些程序员不关注日常生活中的代理,我在这先说说日常生活中的代理,举一个简单的例子,比如说苏宁电器(有点做广告的意思)苏宁电器自己是不生产产品的,苏宁自身就是一个代理,他是联想,是苹果,是夏普等的代理,苏宁帮助这些厂家来卖产品,苏宁会和各个厂家签订合同来帮助厂家卖她们的产品,也就是类似于苹果中,实现方(被动方)可以遵守多个协议,各个实现,当然了,主动方也可以制定多个合约,让不同的被动方(代理)来帮助他做事,在苹果中意思就是被动方可以遵守多个协议,主动方可以制定多个协议,它们之间并不是那么真心的。好了,我下边给一个demo来帮我们理解,这个demo实现的很简单,就是一个view继承于NSObject,他想实现一个弹窗效果,就制定一个协议,并写上了协议需要实现的方法,然后自己就不管了,这个时候,一个controller看到了,很感兴趣,赶紧招呼view,说他能帮助view实现这个效果,可能需要报酬(至于报酬是什么,我就不知道了),于是,view和controller谈好利益后,view就把controller设置为了代理,然后,controller就实现了这个弹窗效果,等view需要这个效果的时候,招呼一下controller,回调一下就可以了。代码如下:

view.h中 

#import <Foundation/Foundation.h>


@protocol updateAlertDelegate <NSObject>


- (void)showAlert;


@end


@interface View :NSObject


@property (nonatomic,weak)id <updateAlertDelegate>delegate;


- (void)startTimer;


@end


view.m 中:

#import "View.h"


@implementation View


- (void)startTimer {

    [NSTimerscheduledTimerWithTimeInterval:5.0ftarget:selfselector:@selector(update11)userInfo:nilrepeats:YES];

}


- (void)update11 {

    if (self.delegate&&[self.delegaterespondsToSelector:@selector(showAlert)]) {

        [self.delegateshowAlert];

    }

 }


@end


controller.m中:

#import"ViewController.h"


@interfaceViewController ()<updateAlertDelegate>


@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    self.view.backgroundColor = [UIColorredColor];

    View *view = [[Viewalloc]init];

    view.delegate =self;

    [view startTimer];

}


- (void)showAlert {

    UIAlertController *alert = [UIAlertControlleralertControllerWithTitle:@"alert"message:@"This is a alert"preferredStyle:UIAlertControllerStyleAlert];

   [alertaddTextFieldWithConfigurationHandler:^(UITextField *_Nonnull textField) {

      textField.keyboardType =UIKeyboardTypeNumberPad;

   }];

   [alertaddAction:[UIAlertActionactionWithTitle:@"Cancel"style:UIAlertActionStyleCancelhandler:nil]];

   [alertaddAction:[UIAlertActionactionWithTitle:@"Delete"style:UIAlertActionStyleDestructivehandler:nil]];

   [alertaddAction:[UIAlertActionactionWithTitle:@"OK"style:UIAlertActionStyleDefaulthandler:nil]];

  

   [selfpresentViewController:alertanimated:YEScompletion:nil];

}


- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end


自己试着敲敲,就这么回事,至于block,我会在下一篇来说




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值