iOS-デリゲート

委任の例

オブジェクトAがオブジェクトBを呼び出してアクションを実行するとします。アクションが完了すると、オブジェクトAは、Bがタスクを完了したことを認識し、必要なアクションを実行する必要があります。これは、代表者の助けを借りて達成されます。

上記の例の重要な概念は次のとおりです。

  • AはBのデリゲートオブジェクトです。

  • BにはAの参照があります。

  • AはBのデリゲートメソッドを実装します。

  • Bはデリゲートメソッドを介してAに通知します。

デリゲートを作成する手順

Step 1 −まず、シングルビューアプリケーションを作成します。

Step 2 −次に、[ファイル]→[新規]→[ファイル...]を選択します。

Step 3 −次に、Objective C Classを選択し、Nextをクリックします。

Step 4 −以下に示すように、NSObjectとしてサブクラスを持つSampleProtocolなどの名前をクラスに付けます。

Step 5 −次に、作成を選択します。

Step 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

Step 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

Step 8 −以下に示すように、オブジェクトライブラリからUIViewにラベルをドラッグして、ViewController.xibにUILabelを追加します。

Step 9 −ラベルのIBOutletを作成し、myLabelという名前を付け、次のようにコードを更新して、ViewController.hでSampleProtocolDelegateを採用します。

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

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

Step 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

Step 11次のような出力が表示されます。最初、ラベルには「処理中...」と表示されます。これは、デリゲートメソッドがSampleProtocolオブジェクトによって呼び出されると更新されます。