2011-08-13 53 views
0
@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,为什么这不起作用?客观c,代表

+0

欢迎堆栈溢出,并请阅读[如何提问](http://stackoverflow.com/questions/how-to-ask)前问这问那... – jtbandes

回答

1

如果我理解正确你正在尝试做的,这应该是正确的:

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

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

否则,当你调用[delegate didSomeAction];delegate是零,该消息被忽略。

2

您需要将b设置为委托。

self.delegate = b; 

但是使用委托通常的方式是倒过来:

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

注意代表团是不客观的-C的功能。这只是一种设计模式! http://en.wikipedia.org/wiki/Delegation_pattern

+0

谢谢,它的工作)) – koke

0

对象通常不会自己创建它们的代表。相反B应该创建一个实例的A,并设置自己为对象的委托:

@implementation B 

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

@end 
0

如果你只是想发送简单的消息给其他类,可以使用NSNotification

在B级文件

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

在类文件中

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

} 

因此,只要你的someMethod调用,那么你的B类将只是发送消息到你的类A来调用didSomeAction。在dealloc中删除观察者

-(void)dealloc{ 
     [[NSNotificationCenter defaultCenter] removeObserver:self]; 
     [super dealloc]; 
} 
+0

有替代方法以及**只是将消息**从一个类A传递给一个类B –

+0

简短,清除非常有帮助 – koke

+0

嗯。现在它为你工作? –