4

我一直在努力将我的一个应用程序从“shared appdelegate”进程中移开,尽管它的使用量很大,但似乎不受欢迎。我一直在尝试为我想做的事情设置协议方法,但运气为零。我的问题是,您甚至可以说一个视图控制器将委托请求发送到多个类吗?从即时通讯发现它似乎并不像你可以。这没有任何意义,因为我认为这就是 mvc 的委托和协议的全部意义所在。现在澄清一下,我知道您可以让一个视图控制器充当多个其他视图控制器的代表。但这不是我要问的。举个简单的例子,假设你有苹果翻转实用程序模板。“完成”按钮只是调用 mainvc 的委托方法来解除它。

@interface NewClass : NSObject <TheOtherDelegate>

它有一个委托方法......

- (void)doSomething
{
NSLog(@"The Delegate did something...");
}

我们可以在 Flipsideviewcontroller 上有一个按钮,我们想调用该委托方法,但仍然保持“完成”按钮调用 mainviewcontroller 上的委托方法以解除它吗?

话虽这么说,我整理了一个快速项目,只是想看看它是否可行,但它不可行。我遇到了一个“答案”,说你必须先实例化你想成为代表的类......

NewClass *myDelegate = [NewClass alloc] init]
[fillInMethodHere setDelegate:myDelegate];

不知道为什么它得到了正确的答案检查,因为不用说它不起作用。有什么我想念的吗?我搜索了 ib 以查看某处是否有一些“代表”连接,但我找不到任何东西。

在旁注中,当我在我的工作项目中工作时,我阅读了关于删除#import和添加@class. 再次,这打破了各种各样的事情。奇怪的是,在这样做之前,我到目前为止的工作和建设都很好。当我删除新的@class并取消注释时#import。xcode 突然给了我一个错误“找不到协议减速...”但是,它在几秒钟前就起作用了。我将不得不删除协议代码并重新添加它才能再次工作。非常明星。

任何帮助,将不胜感激。iv 在文档、谷歌、堆栈等中读到的所有内容都说应该有效,而不是在实际项目中。

4

1 回答 1

12

“代表”不是什么花哨的对象。它只是一个名为 id 类型的综合属性delegate。如果你愿意,你可以拥有任意数量的属性,它们都符合相同的协议。然后,当您想发出回调时,您只需解决所有这些问题:

[self.mydelegateA doSomething];
[self.mydelegateB doSomething];

等等

您还可以拥有一个NSMutableArray可以添加对象的属性,然后使用[self.myMutableArrayOfDelegates makeObjectsPerformSelector:@selector(doSomething)].

最后,总有一个路由NSNotificationCenter(不要与推送通知混淆)是一个提供对象间消息传递系统的类。许多对象可以注册任何其他对象可以发送的消息。

请参阅 Apple 的文档以获取更多信息。点击这里。

尽管这是 OS X 文档,但它仍然非常擅长直观地解释事物:单击此处。

这是一个简单更改委托属性名称的示例:单击此处

这是添加另一个协议和第二个委托的示例:单击此处

最后,这是一个建立在前两个基础上的示例,并且有第三个委托也符合相同的协议:单击此处

于 2012-04-28T03:42:46.110 回答