9

別のファイル(myProtocol.h)でプロトコルを定義しました。そのためのコードは次のとおりです。

#import <Foundation/Foundation.h>

@protocol myProtocol <NSObject>
    -(void) loadDataComplete;
@end

このメソッドを呼び出したいので、次のコードを実行しました。

firstViewController.h

#import "myProtocol.h"

@interface firstViewController : UIViewController{
    id <myProtocol> delegate;
}
@property (retain) id delegate;
-(void) mymethod;

firstViewController.m

@implementation firstViewController
@synthesize delegate;

- (void)viewDidLoad {
    [self mymethod];
}

-(void) mymethod {
    //some code here...
    [delegate loadDataComplete];
}

プロトコルも利用されている別のファイルがあります。

secondViewController.h

#import "myProtocol.h"
@interface secondViewController : UIViewController<myProtocol>{
}

secondViewController.m

-(void) loadDataComplete{
    NSLog(@"loadDataComplete called");
}

しかし、私のsecondViewControllerはプロトコルメタドを呼び出していません。なんでそうなの?任意の提案をいただければ幸いです。

4

1 に答える 1

14

まず、@ Abizernが提案したように、コードを少し再フォーマットしてみてください。クラスには大文字を使用します。これはあなたの答えの解決策です。

これがプロトコルです。FirstViewControllerDelegateオブジェクトを実装するクラスはのデリゲートであるため、このように名前を付けますFirstViewController

#import <Foundation/Foundation.h>

@protocol MyProtocol <NSObject>

- (void)doSomething;

@end

これはSecondViewControllerです。

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

@interface SecondViewController : UIViewController <MyProtocol>

@end

@implementation SecondViewController

// other code here...

- (void)doSomething
{
    NSLog(@"Hello FirstViewController");
}

@end

これはFirstViewControllerです。

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController

// it coud be better to declare these properties within a class extension but for the sake of simplicity you could leave here
// the important thing is to not declare the delegate prop with a strong/retain property but with a weak/assign one, otherwise you can create cycle
@property (nonatomic, strong) SecondViewController* childController;
@property (nonatomic, weak) id<MyProtocol> delegate;

@end

@implementation FirstViewController

// other code here...

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.childController = [[SecondViewController alloc] init];
    self.delegate = self.childController; // here the central point

    // be sure your delegate (SecondViewController) responds to doSomething method
    if(![self.delegate respondsToSelector:@selector(doSomething)]) {

        NSLog(@"delegate cannot respond");
    } else {

        NSLog(@"delegate can respond");
        [self.delegate doSomething];
    }    
}

@end

完全を期すために、デリゲートパターンの意味を必ず理解してください。Appledocはあなたの友達です。プロトコルと委任の基本を見て、議論の基本的な紹介をすることができます。さらに、SO検索を使用すると、トピックに関する多くの回答を見つけることができます。

お役に立てば幸いです。

于 2012-07-14T11:03:26.317 に答える