Вызвать методы, объявленные в протоколе из реализации класса - PullRequest
1 голос
/ 27 декабря 2010

Я создал протокол с именем RecDelegate , который состоял из метода " - (void) doSmtng ".Протокол определяется в rec.h непосредственно перед объявлением интерфейса rec.
Когда я создаю новое приложение и принимаю RecDelegate в новом appDelegate Я могу реализовать свой собственный doSmtng, если это необходимо.
Чего я не понимаю, так это как я могу вызвать метод doSmtng из rec.m (реализация класса, в котором определен протокол ...)- Имеется в виду, как я могу "запустить" doSmtng таким образом, чтобы была запущена реализация нового appDelegate.

Надеюсь, то, что я сказал, относительно ясно ...;)

СпасибоГай.

Ответы [ 3 ]

2 голосов
/ 27 декабря 2010

Ниже приведены два контроллера, показывающие, как вызвать событие от одного к другому. Везде, где есть комментарий "// ЗДЕСЬ", он указывает, что есть код, связанный с делегированием.

ОТПРАВИТЕЛЬ ДЕЛЕГАТА

SecondViewController.h

#import <UIKit/UIKit.h> 

@protocol SecondDelegate <NSObject> // HERE
  @optional
    -(void)MessageReceived:(NSString *)msg;
@end


@interface SecondViewController : UIViewController {
    id<SecondDelegate> secondDelegate; // HERE
}

@property (assign) id<SecondDelegate> secondDelegate; // HERE

-(IBAction)trigger:(id)sender;

@end

SecondViewController.m

#import "SecondViewController.h" 

@implementation SecondViewController

@synthesize secondDelegate; // HERE

-(IBAction)trigger:(id)sender {
    if (self.secondDelegate != NULL && [self.secondDelegate  respondsToSelector:@selector(MessageReceived:)]) { // HERE
        [secondDelegate MessageReceived:@"my message"]; 
    }
}

ПРИЕМНИК ДЕЛЕГАТА

FirstViewController.h

#import <UIKit/UIKit.h>
#import "SecondViewController.h" // HERE

@interface FirstViewController : UINavigationController <SecondDelegate> // HERE

-(void)MessageReceived:(NSString*)msg; // HERE

@end

FirstViewController.m

#import "FirstViewController.h"
#import "SecondViewController.h"

@implementation FirstViewController

 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {
        // Custom initialization
        [self.view setBackgroundColor:[UIColor greenColor]];
        SecondViewController *second = [[SecondViewController alloc] init];
        [self pushViewController:second animated:YES];
        second.secondDelegate = self; // HERE
        [second release];
    }
    return self;
}

-(void)MessageReceived:(NSString *)msg { // HERE
    int y = 0; // HERE IT IS !
}
1 голос
/ 27 декабря 2010

Вы должны указать вашему Rec объекту, что он должен рассматривать ваш AppDelegate как своего делегата:

[rec setDelegate:appDelegate];

Это можно сделать через Интерфейсный Разработчик или сразу после создания объекта Rec.

Затем, когда объект Rec отправляет сообщение делегата своему делегату, получателем будет ваш экземпляр AppDelegate:

[[self delegate] doSmtng];

Если сообщение, которое объект Rec отправляет своему делегату, было необязательным протокольным сообщением, оно было бы отправлено следующим образом:

if ([[self delegate] respondsToSelector:@selector(optionalProtocolMethod)]) {
    [[self delegate] optionalProtocolMethod];
}

delegate обычно объявляется что-то вроде:

@property(assign, nonatomic) id<RecDelegate> delegate;

Поскольку он не сохраняется, в -dealloc объекту Rec нужно только nil его вывести, а не освободить:

delegate = nil;
0 голосов
/ 27 декабря 2010

Еще один способ сделать что-то подобное - использовать NSNotificationCenter

в вашем методе инициализации RecDelegate добавьте:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doSmtng) name:@"someNotification" object:nil];

и в любом другом месте / звонке любого класса

[[NSNotificationCenter defaultCenter] postNotificationName:@"someNotification" object:nil]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...