zoukankan      html  css  js  c++  java
  • [IOS Delegate和协议]

    转载请注明出处

    http://blog.csdn.net/pony_maggie/article/details/25655443

    作者:小马

    代理和协议的语法这里不赘述,自己查资料。

    这个demo的思路是这样的,有一个A类,这个类不是一个基于视图类,它继承自NSObject,这个类会启动一个定时器,当定时器触发时,它会触发B视图弹出一个alert提醒。因为A类没法直接操作B视图,所以它用委托机制,“委托”B视图来操作。

    新建一个view的工程,名为DelegateDemo,默认生成的这个视图就是我们的B视图。然后新建一个timeControl类,作为我们的A类。

    A类的头文件先要定义一个协议,这个我们的代理要遵循的协议,然后应该还有一个公共的方法,用来启动定时器,代码如下:

    #import <Foundation/Foundation.h>
    
    
    //协议定义
    @protocol UpdateAlertDelegate <NSObject>
    - (void)updateAlert;
    @end
    
    
    @interface TimerControl : NSObject
    //遵循协议的一个代理变量定义
    @property (nonatomic, weak) id<UpdateAlertDelegate> delegate;
    
    - (void) startTheTimer;
       
    @end

    然后我们看看A类的实现文件,非常简单,启动定时器,定时器触发就通过代理对象更新视图:

    @implementation TimerControl
    
    
    - (void) startTheTimer
    {
    
        [NSTimer scheduledTimerWithTimeInterval:5.0f target:self selector:@selector(timerProc) userInfo:nil repeats:NO];
    }
    
    - (void) timerProc
    {
        [self.delegate updateAlert];//代理更新UI
    }
    
    @end

    再来看看视图类,它首先要遵循上面定义的协议,才能”帮助”A类来处理事情,如下:

     
    #import <UIKit/UIKit.h>
    #import "TimerControl.h"
    
    @interface DelegateDemoViewController : UIViewController<UpdateAlertDelegate>
    
    @end

    很明显,协议在这里就像中间人的作用,没有这个中间人,就无法”受理代理”。注意代理和协议并不是总要一起实现,只是大部分情况下我们会用协议来辅助实现代理。B视图的实现文件也很简单: 

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        TimerControl *timer = [[TimerControl alloc] init];
        timer.delegate = self; //设置代理实例
        [timer startTheTimer];//启动定时器,定时5触发
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    //"被代理对象"实现协议声明的方法,由"代理对象"调用
    - (void)updateAlert
    {
        UIAlertView *alert=[[UIAlertView alloc] initWithTitle:@"提示" message:@"时间到" delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定",nil];
        
        alert.alertViewStyle=UIAlertViewStyleDefault;
        [alert show];
    }

    源码下载地址:

    https://github.com/pony-maggie/DelegateDemo

  • 相关阅读:
    转面函数
    物体零层级的中间变量
    建模过程中的模型模式。
    关于位置的东西 这里的写法。
    建模小函数
    modPanel.getCurrentObject() 当前选择的修改层级的 基础物体。
    由程序改写的对齐资料。还是资料不完善
    界面资料 用的是内部数子外部字符显示,计算时还是用数字因为数字不字符快
    可能会更新场景 这个就是换了全局函数防止出错,加入的报错系统
    repo sync problems – Android Eclair
  • 原文地址:https://www.cnblogs.com/rayshen/p/3968666.html
Copyright © 2011-2022 走看看