Протокол 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];
}
Другие вопросы по тегам