web-dev-qa-db-ja.com

Objective-Cでカスタムデリゲートを使用する方法

Objective-Cでのデリゲートメソッドの使用について知る必要があります。誰でも私を正しいソースに向けることができますか?

51
Sreelal

クラスのデリゲートプロトコルを宣言する必要があります。クラスFooのデリゲートプロトコルとインターフェイスの例は次のようになります。

@class Foo;
@protocol FooDelegate <NSObject>
@optional
- (BOOL)foo:(Foo *)foo willDoSomethingAnimated:(BOOL)flag;
- (void)foo:(Foo *)foo didDoSomethingAnimated:(BOOL)flag;
@end

@interface Foo : NSObject {
     NSString *bar;
     id <FooDelegate> delegate;
}

@property (nonatomic, retain) NSString *bar;
@property (nonatomic, assign) id <FooDelegate> delegate;

- (void)someAction;

@end

@implementationでプロパティを合成することを忘れないでください。

このコードが行ったことは、FooDelegateというプロトコルを宣言することでした。このプロトコルに準拠するクラスは、@interface SomeClass : SuperClass <FooDelegate> {}のように宣言されます。このクラスはプロトコルFooDelegateに準拠しているため、FooDelegateの下にメソッドを実装できるようになりました(これらの実装を要求するには、@requiredの代わりに@optionalを使用します) 。最後のステップでは、Fooに準拠するクラスでFooDelegateオブジェクトをインスタンス化し、このFooオブジェクトのデリゲートプロパティを設定します。

Foo *obj = [[Foo alloc] init];
[obj setDelegate:self];

これで、クラスは、デリゲートが正しく設定されているFooオブジェクトからメッセージを受信する準備ができました。

128

デリゲートは、アプリ内のView Controllerの配列内の転送を手動で制御するのに非常に便利です。デリゲートを使用すると、制御フローを非常にうまく管理できます。

独自のデリゲートの小さな例です。

  1. プロトコルクラスを作成します...(.hのみ)

SampleDelegate.h

#import
@protocol SampleDelegate
@optional

#pragma Home Delegate

-(NSString *)getViewName;

@end
  1. 別のクラスのデリゲートを作成するクラスに、上記のプロトコルクラスをインポートします。ここで私の元。 AppDelegateを使用して、HomeViewControllerのオブジェクトのデリゲートを作成しています。

また、デリゲートリファレンス<>のDelegateNameを追加します

ownDelegateAppDelegate.h

#import "SampleDelegate.h"

@interface ownDelegateAppDelegate : NSObject <UIApplicationDelegate, SampleDelegate>
{


}

ownDelegateAppDelegate.m

//setDelegate of the HomeViewController's object as
[homeViewControllerObject setDelegate:self];

//add this delegate method definition
-(NSString *)getViewName
{
    return @"Delegate Called";
}

HomeViewController.h

#import
#import "SampleDelegate.h"

@interface HomeViewController : UIViewController 
{

    id<SampleDelegate>delegate;
}

@property(readwrite , assign) id<SampleDelegate>delegate;

@end

HomeViewController.h

- (void)viewDidAppear:(BOOL)animated 
{

    [super viewDidAppear:animated];
    UILabel *lblTitle = [[UILabel alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    lblTitle.text = [delegate getViewName];
    lblTitle.textAlignment = UITextAlignmentCenter;
    [self.view addSubview:lblTitle];

}
8
iCrazyDev

はじめに、デリゲートメソッドについてのAppleの説明を参照してください。このドキュメントでは、委任とは何かについてよく書かれた情報を提供し、AppKitクラスの使用方法とデリゲートを定義およびサポートし、デリゲートサポートを独自のオブジェクトの1つにコーディングする方法。

オブジェクトとの通信 を参照してください

(独自のデリゲートサポートのコーディングに興味がある場合は、「カスタムクラスのデリゲートの実装」セクションに進んでください。)

デリゲートメソッドを取り除く最も重要な側面は、サブクラス化せずにオブジェクトの動作をカスタマイズし、影響を与えることができることです。

それがあなたが始めるのに役立つことを願っています。

2
Sean Murphy

問題のオブジェクトのdelegateが、作成したクラス、たとえばcontrollerに割り当てられている場合、そのオブジェクトのクラスのdelegateメソッドとして定義されたメソッドを実装する必要があります割り当てられたクラスごと。これにより、オブジェクトのクラスをサブクラス化せずにオブジェクトの動作を効果的に制御して、大量の複製動作が必要になる可能性のある動作をオーバーライドできます。これは、ココアタッチデザインのクリーナーパーツの1つです。

これは、ココアタッチのイントロとチュートリアルの最初のカップルで取り上げるべきものです。このように Cocoaのチュートリアルは私のガールフレンドです 。実際、彼らはdelegateの説明を大胆な見出しにしました。

2
dlamblin