Я пытаюсь заставить протокол работать, но возникают некоторые проблемы.

мой класс протокола.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>

мой 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 для« BaseFormViewController »объявляет селектор« getDirections :: », что я здесь делаю не так?

0
BluGeni 19 Май 2014 в 18:34

4 ответа

Лучший ответ

На вашем месте я сделал бы это так:

@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;
    ...
}

Таким образом, ваш контроллер представления реализует сам протокол

Надеюсь, это поможет

0
tanou 19 Май 2014 в 14:47

Здесь, поскольку вы написали под тегом @required, вам необходимо указать определение для этого метода, иначе он выдаст вам предупреждение, которое вы получаете.

Вы можете написать метод под двумя тегами. 1) @required: в этом теге все методы, которые вы объявляете, вы должны указать в своем классе.

2) @optional: в этом теге все методы, которые вы объявляете, являются необязательными, если вы не пишете, также вы не получаете предупреждений.

0
Maheta Dhaval K 19 Май 2014 в 14:48

ViewController1 должен реализовать требуемые методы, поскольку вы заявили, что он соответствует протоколу FormViewDelegate.

@implementation ViewController1

- (void)getDirections:(NSString*)address :(NSString*)cityStateZip 
{
// your implementation
}

@end
0
lucianomarisi 19 Май 2014 в 14:51

Это так просто. BaseFormViewController не соответствует FormViewDelegate - поэтому он ничего не знает об этом методе:

- (void)getDirections:(NSString*)address :(NSString*)cityStateZip;

Если вы хотите передать этот метод в BaseFormViewController, сделайте его совместимым с FormViewDelegate. И (необязательно) переместите свойство делегата из BaseFormViewController в ViewController1.

0
evil159 19 Май 2014 в 17:02