我正在努力让协议正常运行但有一些问题。
我的协议class.h
@protocol FormViewDelegate <NSObject>
// sent when the user selects a row in the recent searches list
@required
- (void)getDirections:(NSString*)address :(NSString*)cityStateZip;
@end
@interface BaseFormViewController : NSObject
@property (nonatomic, weak) id<FormViewDelegate> delegate;
@end
我的viewcontroller.h
#import "BaseFormViewController.h"
@interface ViewController1 : <FormViewDelegate>
my viewcontroller.m
@implementation ViewController1
{
BaseFormViewController *baseProtocol;
}
- (IBAction)getDirections:(id)sender {
[baseProtocol getDirections:self.address.text :self.cityStateZip.text];
}
- (void)viewDidLoad
{
[super viewDidLoad];
baseProtocol = [[BaseFormViewController alloc]init];
baseProtocol.delegate = self;
...
}
我收到一个编译错误说明:没有可见的@interface用于&#39; BaseFormViewController&#39;声明选择器&#39; getDirections ::&#39;我在这做错了什么?
答案 0 :(得分:0)
ViewController1
需要实现所需的方法,因为您声明它符合FormViewDelegate
协议。
@implementation ViewController1
- (void)getDirections:(NSString*)address :(NSString*)cityStateZip
{
// your implementation
}
@end
答案 1 :(得分:0)
如果我是你,我会这样做:
@protocol FormViewDelegate <NSObject>
// sent when the user selects a row in the recent searches list
@required
- (void)getDirections:(NSString*)address :(NSString*)cityStateZip;
@end
然后是你的view controller.h
@interface ViewController1 : <FormViewDelegate>
@property (nonatomic, weak) id<FormViewDelegate> delegate;
@end
然后是您的视图控制器
@implementation ViewController1
@synthesize delegate
- (IBAction)getDirections:(id)sender {
[baseProtocol getDirections:self.address.text :self.cityStateZip.text];
}
- (void)viewDidLoad
{
[super viewDidLoad];
baseProtocol = [[BaseFormViewController alloc]init];
baseProtocol.delegate = self;
...
}
这样您的视图控制器就可以实现协议本身
希望有所帮助
答案 2 :(得分:0)
这里因为你已经在@required标签下写了,所以你必须为该方法编写定义,否则它会给你警告你正在获得。
您可以在两个标签下编写方法。 1)@required:在这个标签中,你声明的所有方法都必须在你的课堂上指定。
2)@optional:在这个标签中,你声明的所有方法都是可选方法,如果你不写,你也不会收到警告。
答案 3 :(得分:0)
就这么简单。 BaseFormViewController
不符合FormViewDelegate
- 因此它不了解此方法:
- (void)getDirections:(NSString*)address :(NSString*)cityStateZip;
如果您想将该方法传递给BaseFormViewController
,请使其符合FormViewDelegate
。并且(可选)将委托属性从BaseFormViewController
移动到ViewController1
。