使用第一响应者而不是将方法链接到控制器层次结构中是好的应用程序设计吗?

Posted

技术标签:

【中文标题】使用第一响应者而不是将方法链接到控制器层次结构中是好的应用程序设计吗?【英文标题】:Is it good App design to use first responder instead of chaining methods down the controller hierarchy? 【发布时间】:2015-08-05 22:40:02 【问题描述】:

这个问题是针对 OSX 应用的,但同样的原则也适用于 ios

我在情节提要上有一个 NSWindowController 具有以下设置。

A. MainWindowController 有子视图:

1) 带有按钮的工具栏

2) 一个有自己的内容的SubVcA viewController

B. SubVcA 的内容是 SubVcB viewController 的视图

C.SubVcB有一个函数ButtonPressed

目标是通过点击工具栏按钮来触发SubVcB viewController 中的按钮按下功能。

我一直这样做的方法是从 mainWindowController 到目标 viewController 的方法实现链,如下所示:

MainWindowController call method on SubVcA
-->SubVcA call method on SubVcB
---> SubVcB call method buttonPressed

这可行,但是当控制器堆栈达到大约 4 层时它会变得混乱。 当 SubVC(B) 必须将数据发送回 MainWindowController 时,它也会变得更加混乱,因为为了进行封装(如不让 SubVC(B) 拥有太多关于其调用 viewControllers 的信息),我必须在链上实现委托方法。当你有多个工具栏按钮时,它会变得更加混乱。

现在...我刚刚开始处理 Storyboard 上的 firstResponder 项目

我意识到它会弹出一个巨大的列表,其中包含在您的应用程序中使用-(IBAction) 实现的所有方法。

所以我现在的问题是: 为了减少视图层次结构上下的方法混乱,使用情节提要上的 firstResponder 对象将 MainWindowController 的工具栏按钮操作直接连接到 SubVc(B) viewController 中的 buttonPressed 方法是否是一个好的应用程序设计?

另外,还有其他设计模式可以减少混乱吗?

【问题讨论】:

这个问题与Objective-C语言无关,也与ObjC编写的代码无关;请不要再次添加该标签。 标签用于按主题对问题进行分类。他们完成了“这个问题是关于……”的句子,将它们用于“曝光”或“这与……有关”会使您在搜索时更难找到解决方案。无论如何,很多人都会关注 [cocoa] 和 [cocoa-touch] 标签。 看起来很合理。如果您曾经对应用程序菜单项进行过任何自定义,您会看到它是以这种方式完成的。避免这种混乱的另一种方法是发布通知或使用 KVO 监控更改。 【参考方案1】:

使用第一响应者允许以零为目标的操作将响应者链向上渗透到可以处理它的任何人正是第一响应者的用途。这显然比自己传递信息要简单得多。

【讨论】:

更多关于响应者链和 nil-targeted 动作(在 iOS 上)在我的书中:apeth.com/iOSBook/ch11.html#_the_responder_chain

以上是关于使用第一响应者而不是将方法链接到控制器层次结构中是好的应用程序设计吗?的主要内容,如果未能解决你的问题,请参考以下文章

集合视图将 segue 推向自身

项目层次结构 Idea 而不是 BlueJ

符号链接复制目录层次结构

将弹出框添加到当前导航控制器层次结构

将模态视图控制器添加到父子视图控制器层次结构

将 ExtJS MVC 控制器附加到 DOM 元素,而不是组件