Цель c, делегаты - PullRequest
       2

Цель c, делегаты

0 голосов
/ 13 августа 2011
@protocol SomeDelegate
- (void) didSomeAction;
@end

@interface A:ViewController {
id<SomeDelegate> delegate;
}

@property (nonatomic, retain) id<SomeDelegate> delegate;

@implementation A
@synthesize delegate;

- (void)someMethod {
[delegate didSomeAction];
}

- (void)viewDidLoad {
B *b = [[B alloc] init];
}

/*=========================*/

@interface B:NSObject<SomeDelegate> {

}

@implementation B

#pragma mark - 
#pragma mark SomeDelegate methods

- (void)didSomeAction {

}

B должен отправить сообщение A, почему это не работает?

Ответы [ 4 ]

2 голосов
/ 13 августа 2011

Вам необходимо установить b в качестве делегата.

self.delegate = b;

Однако обычный способ использования делегатов - наоборот:

SomeClass* obj = [[SomeClass alloc] init];
obj.delegate = self;

Обратите внимание, что делегирование не является функциейObjective-C.Это всего лишь шаблон дизайна!http://en.wikipedia.org/wiki/Delegation_pattern

1 голос
/ 13 августа 2011

Если я правильно понимаю, что вы пытаетесь сделать, это должно быть правильно:

 -(void)someMethod {
    [delegate didSomeAction];
 }

 -(void)viewDidLoad {
    delegate = [[B alloc] init];
 }

в противном случае, когда вы звоните [delegate didSomeAction];, delegate равен нулю, а сообщение игнорируется.

0 голосов
/ 13 августа 2011

Если вы просто хотите отправить простое сообщение другому классу, можете использовать NSNotification

В файле класса B

- (void)someMethod {
     [[NSNotificationCenter defaultCenter] postNotificationName:@"NofifyMe" object:self userInfo:nil];
}

В файле класса A

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didSomeAction:) name:@"NofifyMe" object:nil];
- (void)didSomeAction {

}

Таким образом, всякий раз, когда ваш someMethod будет вызывать, ваш класс B просто отправит сообщение вашему классу A для вызова didSomeAction.и в деиллоке удалите наблюдателя

-(void)dealloc{
        [[NSNotificationCenter defaultCenter] removeObserver:self];
        [super dealloc];
}
0 голосов
/ 13 августа 2011

Объекты обычно не создают своих делегатов сами.Вместо этого B должен создать экземпляр A и установить себя в качестве делегата этого объекта:

@implementation B

- (void)awakeFromNib {
    self.a = [[[A alloc] init] autorelease];
    self.a.delegate = self;
}

@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...