-(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 Width:(int)w Mines:(int)m;根据optionsViewController协议的要求,这意味着我不再需要导入根.h文件。
我打算使用委托在程序的其他部分发送消息,所以我想确保我正确使用它而不是在我不需要时导入的东西。 谢谢。
答案 0 :(得分:1)
如果我添加 - (void)setHeight:(int)h Width:(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