0
-(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 文件。

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

4

2 回答 2

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>

//.....

于 2013-04-06T22:02:15.833 回答
0

如果您将delegate属性定义为 class 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
于 2013-04-06T21:57:53.520 回答