客观c,代表
问题描述:
@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,代表
答
如果我理解正确你正在尝试做的,这应该是正确的:
-(void)someMethod {
[delegate didSomeAction];
}
-(void)viewDidLoad {
delegate = [[B alloc] init];
}
否则,当你调用[delegate didSomeAction];
,delegate
是零,该消息被忽略。
答
您需要将b设置为委托。
self.delegate = b;
但是使用委托通常的方式是倒过来:
SomeClass* obj = [[SomeClass alloc] init];
obj.delegate = self;
注意代表团是不客观的-C的功能。这只是一种设计模式! http://en.wikipedia.org/wiki/Delegation_pattern
+0
谢谢,它的工作)) – koke
答
对象通常不会自己创建它们的代表。相反B
应该创建一个实例的A
,并设置自己为对象的委托:
@implementation B
- (void)awakeFromNib {
self.a = [[[A alloc] init] autorelease];
self.a.delegate = self;
}
@end
答
如果你只是想发送简单的消息给其他类,可以使用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];
}
欢迎堆栈溢出,并请阅读[如何提问](http://stackoverflow.com/questions/how-to-ask)前问这问那... – jtbandes