MY_iOS_之簡(jiǎn)單代理(delegate)實(shí)現(xiàn)

項(xiàng)目一定要簡(jiǎn)潔明了, 代碼通俗易懂, 易于維護(hù).

可以把一些實(shí)現(xiàn)方法封裝到代理, 以簡(jiǎn)化Controller中的代碼

昨天做了一個(gè)demo,用到了簡(jiǎn)單代理。

delegate是ios編程的一種設(shè)計(jì)模式。我們可以用這個(gè)設(shè)計(jì)模式來(lái)讓單繼承的objective-c類(lèi)表現(xiàn)出它父類(lèi)之外類(lèi)的特征。昨天這個(gè)代理實(shí)現(xiàn)如下:

類(lèi)GifView是繼承自UIView的,它加載在RootViewController上來(lái)通過(guò)一個(gè)Timer播放動(dòng)畫(huà)。同時(shí),RootViewController需要知道Timer的每次執(zhí)行。

代碼如下。

首先,定義GifView,在其頭文件中定義代理EveryFrameDelegate,同時(shí)聲明方法- (void)DoSomethingEveryFrame;

#import <UIKit/UIKit.h>

@protocol EveryFrameDelegate <NSObject>

- (void)DoSomethingEveryFrame;

@end

@interface GifView : UIView 
{
    NSTimer *timer;
    id <EveryFrameDelegate> delegate;
    NSInteger currentIndex;
}

@property (nonatomic, assign) id <EveryFrameDelegate> delegate;

@end

然后,只要在GifView.m中讓Timer在每次執(zhí)行的時(shí)候調(diào)用delegate來(lái)執(zhí)行DoSomethingEveryFrame,代碼如下

- (id)initWithFrame:(CGRect)frame
{
    
    self = [super initWithFrame:frame];
    if (self)
    {
        timer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(play) userInfo:nil repeats:YES];
        [timer fire];
    }
    return self;
}

-(void)play
{
        [delegate DoSomethingEveryFrame];
 
}

GifView上的工作就完成了。

下面是RootViewController中的代碼,RootViewController只要在定義GifView的時(shí)候指定其代理為自身,就可以知道Timer的每次執(zhí)行:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    CGRect rect = CGRectMake(0, 0, 200, 200);
    GifView *tmp = [[GifView alloc] initWithFrame:rect];
    tmp.delegate = self;
    [self.view addSubview:tmp];
    [tmp release];
}

- (void)DoSomethingEveryFrame
{
    NSLog(@"I'm the delegate! I'm doing printing!");
}

GifView中Timer每次執(zhí)行都會(huì)打印一行

I'm the delegate! I'm doing printing!

故,RootViewController就知道Timer的每次執(zhí)行了。

====================我是歡樂(lè)的分割線====================

在RootViewController的頭文件中需要引入GifView.h這個(gè)頭文件,并表明RootViewController遵循代理EveryFrameDelegate。否則會(huì)有警告出現(xiàn)。

代碼如下:

#include <UIKit/UIKit.h>
#import "GifView.h"

@interface RootViewController : UIViewController <EveryFrameDelegate>

@end

另外,在定義代理的時(shí)候加上關(guān)鍵字@optional則表明這個(gè)代理可以不用實(shí)現(xiàn)所有的代理方法而不被報(bào)警告。

代碼如下:

@protocol EveryFrameDelegate <NSObject>
@optional

- (void)ifYouNeedThis;
- (void)DoSomethingEveryFrame;

@end

`

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,569評(píng)論 19 139
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,624評(píng)論 30 472
  • 1.Difference between shallow copy and deep copy? 淺復(fù)制和深復(fù)制的...
    用心在飛閱讀 1,070評(píng)論 0 9
  • 開(kāi)始有點(diǎn)相信因果報(bào)應(yīng),不知道有沒(méi)有真的愛(ài)情,現(xiàn)在的狀況就覺(jué)得是之前在無(wú)知的情況下犯錯(cuò)得的報(bào)應(yīng),讓別的人難過(guò),有派另...
    看風(fēng)景的我心情好閱讀 254評(píng)論 0 0
  • 今天我故意當(dāng)著我老公的面說(shuō)我紅包錢(qián)不多了,然后就去上班了,我老公居然給我打了個(gè)大大的紅包呦,我心里很高興,雖然是在...
    凝幻冰瀾閱讀 297評(píng)論 0 0

友情鏈接更多精彩內(nèi)容