使用委托时是否需要导入.h文件?

时间:2013-04-06 21:51:27

标签: objective-c uiviewcontroller protocols delegation

-(IBAction)ok
{
    //send message to the delegate with the new settings
    [self.delegate setHeight:_height Width:_width Mines:_mines];
    [self.delegate dismissViewControllerAnimated:YES completion:nil];
}

在导入ViewController.h之前,代理的第一条消息不起作用,但第二条消息在没有导入的情况下工作。 如果我添加 - (void)setHeight:(int)h W​​idth:(int)w Mines:(int)m;根据optionsViewController协议的要求,这意味着我不再需要导入根.h文件。

我打算使用委托在程序的其他部分发送消息,所以我想确保我正确使用它而不是在我不需要时导入的东西。 谢谢。

2 个答案:

答案 0 :(得分:1)

  

如果我添加 - (void)setHeight:(int)h W​​idth:(int)w Mines:(int)m;根据optionsViewController协议的要求,这意味着我不再需要导入根.h文件。

是的!您也可以将其添加为@optional并且它可以工作(记得在这种情况下检查委托--respondsToSelector:)。整个想法是你的对象经常对委托对象一无所知 - 除了它符合协议(即实现@required和可能的@optional方法)。

添加澄清(在我的手机上,这是一个痛苦的屁股):

//OptionsViewController.h
//this object does NOT have to import
//the calling viewControllers .h file
//which is what I think the OP does

@protocol optionsViewControllerProtocol;

@interface OptionsViewController : UIViewController

@property (nonatomic, assign) id<optionsViewControllerProtocol> delegate; //should be id, could be UIViewController too, if absolutely necessary (better design to make it id) @end

@protocol optionsViewControllerProtocol <NSObject>

@required -(void) setHeight: (NSInteger) height; @end

//viewController.h #import "optionsViewController.h" //necessary to get the protocols definitions

@interface OptionsViewController: UIViewController <optionsViewControllerProtocol>

//.....

答案 1 :(得分:0)

如果您将delegate属性定义为类UIViewController*,则编译器将识别dismissViewControllerAnimated:completion:方法,而无需导入任何内容,因为这是该类的标准方法

对于自定义方法,即setHeight:Width:Mines:,您绝对需要导入头文件,或者将其导入到导入链的某个位置。

示例:您有MyProtocol.h,并且您希望SomeClass拥有符合该协议的委托属性。如果您#import "MyProtocol.h"SomeClass.h,则无需在SomeClass.m中重新导入。

// SomeClass.h
#import "MyProtocol.h"

@interface SomeClass : NSObject
@property (weak, nonatomic) id<MyProtocol> delegate;
@end

//SomeClass.m
#import "SomeClass.h"

@implementation SomeClass

- (void)someMethod
{
    [self.delegate myProtocolMethod];
}
@end