我有一个带有委托didSelectString的类搜索栏。我有一个实现委托的类A和一个实现委托的类B.
但是只执行A类的委托。代表可以有多个听众吗?以及如何实现这个
答案 0 :(得分:14)
委派是一种单一的消息传递协议。如果要向更改的多个对象发送消息,则需要使用NSNotifications。
您可以使用通知中心传递对象:
NSDictionary *userInfo = @{@"myObject" : customObject};
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@"myNotificationString" object:self userInfo:userInfo];
想要收听通知时
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(myCustomObserver:)name:@"myNotificationString" object:nil];
设置选择器
-(void)myCustomObserver:(NSNotification *)notification{
CustomObject* customObject = notification.userInfo[@"myObject"];
}
答案 1 :(得分:3)
您可以轻松设置充当委托多路复用器的trampoline对象。我们的想法是使用一个代理对象来代替一组代理。调用方法时,它将覆盖 forwardInvocation 或使用 * IMP_implementationWithBlock * 将消息传递给数组中的每个代理。
然后您需要做的就是添加方法:attachListener和removeListener(顺便说一句:看看它是如何开始与通知类似的?)
以下是一个示例项目:https://github.com/aleph7/MultiDelegate
有关更多信息,请查看令人敬畏的Objective-C运行时:https://developer.apple.com/library/mac/documentation/cocoa/reference/objcruntimeref/Reference/reference.html
答案 2 :(得分:1)
创建一个名为Delegates的小型新类。它采用搜索栏协议,因此它可以是主要的搜索栏代表。让这个类提供一个方法'addSearchBarDelegate:',它将委托添加到一个可变数组。当它获得委托消息时,它会将其转发给每个注册的委托。