Протокол iOS / Делегат путаница?
Все это мой первый пост, и я постараюсь быть максимально точным. Я прочитал множество статей о реализации протокола / делегата для iOS, но все примеры потерпели неудачу. Допустим, у меня есть контроллер A и B, и я хочу отправить данные из A в BAh
@protocol exampleprot <NSObject>
@required
-(void) exampledmethod:(NSString *) e1;
@end
@interface ViewController
{
__weak id <exampleprot> delegate
}
- Я в какой-то процедуре, я пытаюсь подтолкнуть
[delegate examplemethod:@"test"]
Bh
@interface test2 : UiViewcontroller <exampleprot>
и в Bm реализует метод -(void) примерный метод:(NSString *) e1;
так что я делаю не так?
3 ответа
По сути, это пример пользовательских делегатов, и он используется для отправки сообщений из одного класса в другой. Поэтому для отправки сообщения в другой класс необходимо сначала установить делегат, а затем согласовать протокол и в другом классе. Ниже приведен пример:
B.h
учебный класс
@protocol sampleDelegate <NSObject>
@required
-(NSString *)getDataValue;
@end
@interface BWindowController : NSWindowController
{
id<sampleDelegate>delegate;
}
@property(nonatomic,assign)id<sampleDelegate>delegate;
@end
В B.m
учебный класс
- (void)windowDidLoad
{
//below only calling the method but it is impelmented in AwindowController class
if([[self delegate]respondsToSelector:@selector(getDataValue)]){
NSString *str= [[self delegate]getDataValue];
NSLog(@"Recieved=%@",str);
}
[super windowDidLoad];
}
В A.h
учебный класс
@interface AWindowController : NSWindowController<sampleDelegate> //conforming to the protocol
В A.m
учебный класс
//Implementing the protocol method
-(NSString*)getDataValue
{
NSLog(@"recieved");
return @"recieved";
}
//In this method setting delegate AWindowController to BWindowController
-(void)yourmethod
{
BWindowController *b=[[BWindowController alloc]init];
b.delegate=self; //here setting the delegate
}
Вам необходимо установить свойство делегата контроллера представления, из которого вы хотите отправить данные = контроллер представления, в который вы хотите отправить данные. Я думаю, что ответ Хуссейна правильный. Вам просто нужно проверить, правильно ли вы это делаете.
Если вы хотите отправить данные из A в B, то вам следует определить делегата в B с типом возврата. В B будет объявление делегата:
@protocol example <NSObject>
@required
-(NSString *) exampleMethod;
@end
Затем в A реализуйте этот метод. В Ам вам нужно иметь
-(NSString *) exampleMethod:(NSString *) e1 {
// Implementation of this delegate method
return self.stringYouWantToPassToB
}
Затем в B все, что вам нужно сделать, это использовать этот делегат, чтобы получить то, что вы хотите от A. В Bm у вас есть
- (void)methodInB {
// Get string from delegate
self.string = [self.delegate exampleMethod];
}