位置:首页 > 手机开发 > iOS在线教程 > iOS - Delegates实例

iOS - Delegates实例

举例委托(delegate)

让我们假设一个对象A调用对象B执行一个动作,一旦操作完成对象A知道B已经完成了任务,并采取必要的动作,在委托的帮助下。

在上述例子中的关键概念是,

  • A是B的委托对象

  • B是是A的参考(引用)

  • A将实现委托B的方法

  • B将通知A通过委托方法。

创建一个委托的步骤

1. 首先,创建一个单一的视图应用。

2. 选择 File -> New -> File...

iOS Tutorial

3. 然后选择 Objective C 类并点击 Next.

4. 类名称为 SampleProtocol 为NSObject的子类,如下图所示。

iOS Tutorial

5. 选择创建 create.

6. 添加协议的SampleProtocol.h文件和更新后的代码如下。

#import <Foundation/Foundation.h>
// Protocol definition starts here 
@protocol SampleProtocolDelegate <NSObject>
@required
- (void) processCompleted;
@end
// Protocol Definition ends here
@interface SampleProtocol : NSObject

{
   // Delegate to respond back
   id <SampleProtocolDelegate> _delegate; 

}
@property (nonatomic,strong) id delegate;

-(void)startSampleProcess; // Instance method

@end

7. 实现的实例方法如下所示更新的SampleProtocol.m文件。


#import "SampleProtocol.h"

@implementation SampleProtocol

-(void)startSampleProcess{
    
    [NSTimer scheduledTimerWithTimeInterval:3.0 target:self.delegate 
	selector:@selector(processCompleted) userInfo:nil repeats:NO];
}
@end

8. 添加的 UILabel ViewController.xib从对象库中拖动标签 UIView,如下图所示。

iOS Tutorial

9. 创建一个IBOutlet 标签,并将其命名为 myLabel,并更新SampleProtocolDelegate的代码如下在ViewController.h 文件中


#import <UIKit/UIKit.h>
#import "SampleProtocol.h"

@interface ViewController : UIViewController<SampleProtocolDelegate>
{
    IBOutlet UILabel *myLabel;
}
@end

10. 实施委托方法,创建对象SampleProtocol的,并调用startSampleProcess方法。更新ViewController.m文件如下所示。

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    SampleProtocol *sampleProtocol = [[SampleProtocol alloc]init];
    sampleProtocol.delegate = self;
    [myLabel setText:@"Processing..."];
    [sampleProtocol startSampleProcess];
	// Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark - Sample protocol delegate
-(void)processCompleted{    
    [myLabel setText:@"Process Completed"];
}


@end

11. 我们将看到如下的输出,最初的标签将处理得到更新一次委托方法被调用通过 SampleProtocol对象。

iOS Tutorial