我在一个单独的文件(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没有调用协议美联储.为什么会这样?任何建议将不胜感激.
解决方法
首先,正如@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
为了完整起见,请务必了解委托模式的含义. Apple doc是你的朋友.您可以查看the-basics-of-protocols-and-delegates以获得参数的基本介绍.此外,SO搜索允许您找到关于该主题的大量答案.
希望有所帮助.