课程表

iOS课程

工具箱
速查手册

委托(Delegates)

当前位置:免费教程 » 移动开发 » iOS

委托(Delegates)示例

假设对象A调用B来执行一项操作,操作一旦完成,对象A就必须知道对象B已完成任务且对象A将执行其他必要操作。

在上面的示例中的关键概念有

  • A是B的委托对象
  • B引用一个A
  • A将实现B的委托方法
  • B通过委托方法通知

创建一个委托(Delegates)对象

1. 创建一个单一视图的应用程序

2. 然后选择文件 File -> New -> File...

addNewFile

3. 然后选择Objective C单击下一步

4. 将SampleProtocol的子类命名为NSObject,如下所示

setProtocolName

5. 然后选择创建

6.向SampleProtocol.h文件夹中添加一种协议,然后更新代码,如下所示:

  1. #import <Foundation/Foundation.h>
  2. // 协议定义
  3. @protocol SampleProtocolDelegate <NSObject>
  4. @required
  5. - (void) processCompleted;
  6. @end
  7. // 协议定义结束
  8. @interface SampleProtocol : NSObject
  9.  
  10. {
  11. // Delegate to respond back
  12. id <SampleProtocolDelegate> _delegate;
  13.  
  14. }
  15. @property (nonatomic,strong) id delegate;
  16.  
  17. -(void)startSampleProcess; // Instance method
  18.  
  19. @end

7.修改 SampleProtocol.m 文件代码,实现实例方法:

  1. #import "SampleProtocol.h"
  2.  
  3. @implementation SampleProtocol
  4.  
  5. -(void)startSampleProcess{
  6. [NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate
  7. selector:@selector(processCompleted) userInfo:nil repeats:NO];
  8. }
  9. @end

8. 将标签从对象库拖到UIView,从而在ViewController.xib中添加UILabel,如下所示:

delegateLabel

9. 创建一个IBOutlet标签并命名为myLabel,然后按如下所示更新代码并在ViewController.h里显示SampleProtocolDelegate

  1. #import <UIKit/UIKit.h>
  2. #import "SampleProtocol.h"
  3.  
  4. @interface ViewController : UIViewController<SampleProtocolDelegate>
  5. {
  6. IBOutlet UILabel *myLabel;
  7. }
  8. @end

10. 完成授权方法,为SampleProtocol创建对象和调用startSampleProcess方法。如下所示,更新ViewController.m文件

  1. #import "ViewController.h"
  2.  
  3. @interface ViewController ()
  4.  
  5. @end
  6.  
  7. @implementation ViewController
  8.  
  9. - (void)viewDidLoad
  10. {
  11. [super viewDidLoad];
  12. SampleProtocol *sampleProtocol = [[SampleProtocol alloc]init];
  13. sampleProtocol.delegate = self;
  14. [myLabel setText:@"Processing..."];
  15. [sampleProtocol startSampleProcess];
  16. // Do any additional setup after loading the view, typically from a nib.
  17. }
  18.  
  19. - (void)didReceiveMemoryWarning
  20. {
  21. [super didReceiveMemoryWarning];
  22. // Dispose of any resources that can be recreated.
  23. }
  24.  
  25. #pragma mark - Sample protocol delegate
  26. -(void)processCompleted{
  27. [myLabel setText:@"Process Completed"];
  28. }
  29.  
  30.  
  31. @end

11. 将看到如下所示的输出结果,最初的标签也会继续运行,一旦授权方法被SampleProtocol对象所调用,标签运行程序的代码也会更新。

delegateResult

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号