10

我有一个带有委托 didSelectString 的类搜索栏。我有一个实现委托的 A 类和一个实现委托的 B 类。

然而,只有 A 类的委托被执行。一个委托可以有多个听众吗?以及如何实现

4

3 回答 3

15

委托是一个单一的消息传递协议。如果要向多个对象发送更改消息,则需要使用 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"];
}
于 2013-10-19T10:24:53.937 回答
3

您可以轻松设置充当委托多路复用器的蹦床对象。这个想法是使用一个代理对象来代替一组委托。调用方法时,它将覆盖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

于 2013-10-28T04:48:48.833 回答
2

创建一个名为 Delegates 的小型新类。让它采用搜索栏协议​​,以便它可以成为主要的搜索栏代表。让这个类提供一个方法'addSearchBarDelegate:',在这个方法中它将委托添加到一个可变数组。当它收到一个委托消息时,它会将其转发给每个注册的委托。

于 2013-10-19T12:21:27.040 回答