关于在 View 上向 UIButton 添加目标的 MVC 实践

Posted

技术标签:

【中文标题】关于在 View 上向 UIButton 添加目标的 MVC 实践【英文标题】:MVC practice regarding adding targets to UIButton on View 【发布时间】:2012-03-03 03:49:39 【问题描述】:

我有一个关于向自定义视图上的 UIButton 添加目标时的最佳做法的问题。目前,我在我的视图的加载方法中创建我的 UIButton,并将我的视图指定为按钮目标。我的观点是在按下按钮时处理逻辑,我突然想到这不是好的 MVC。

所以,我宁愿让我的控制器提供自己作为目标和按钮的操作,但是我不确定实现这一点的最佳方法。

可以使用对控制器的引用来初始化视图,或者可以使用 UIResponder 的 nextresponder 获取控制器,并使用此引用设置目标。但是,这可能会导致循环保留,并且需要我的视图了解我的控制器上存在的方法,这比我希望的更紧密耦合。

或者,我可以为视图上的每个 uibutton 创建一个 setter。但是,如果我有多个按钮,或者包含带有按钮的自定义子视图的视图,这很快就会变得笨拙。我还可以为每个按钮创建属性,但这也很笨拙,并且允许控制器访问超出其需要的内容(它只需要设置目标,不需要能够获得对按钮的任何引用)。

最后,我可以为控制器中的所有按钮创建和添加目标,并在初始化时将其传递给视图,但这似乎也违反了 MVC 的角色。

这似乎是一种常见情况,这些做法是否被认为是标准的,还是有更好的解决方案?

【问题讨论】:

什么是“我的观点的加载方法”?是视图的init方法吗?是视图控制器的loadView 方法吗? 对不起,应该更清楚。它只是我在 init 中调用的一个自定义方法,其目的是分配子视图并将它们放在我的视图中。 【参考方案1】:

我个人的看法是,在 Cocoa 中,允许自定义视图具有操作所需的逻辑和状态,但它们应该完全封装逻辑和状态。也就是说,您应该向子视图公开一个接口,而不是子视图本身。您应该通过委托和属性的组合以及自定义操作来公开任何私有属性或子视图。

话虽如此,鉴于您没有提供有关自定义视图目的的细节,因此很难提供最佳方法的细节。

【讨论】:

【参考方案2】:

以拥有按钮的视图为目标是正确的。这样,如果您需要进行任何视图操作(启用/禁用、突出显示、弹出等),那么您来对地方了。此外,只有视图会知道按钮是什么,因此,在您的操作中,如果您想检查sender 是什么,您可以这样做。但是让你的控制器知道每个单独的按钮似乎更严重地违反了 MVC。

为您的按钮设置访问器并非不合适。在运行时提供参考会很方便。如果你不使用它,很难说保留一个额外的id 是有害的。至于将它们隐藏在私有接口中,这很好,但除非您发布 API 或与白痴合作,否则我不知道将访问器公开有什么害处。

您的视图对您的控制器有一个 引用是合适的,并且按钮操作可以像调用控制器的方法之一一样简单。没什么大不了的,如果你想稍后再添加一些逻辑,这里有它的位置。

听起来你做得很好。

PS 这是愚蠢的:

【讨论】:

以上是关于关于在 View 上向 UIButton 添加目标的 MVC 实践的主要内容,如果未能解决你的问题,请参考以下文章

使用didSet将目标添加到UITableViewCell中的UIButton

在 UITableViewCell 中为 UIButton 添加和删除目标操作

使用 UIButton 在 UIView 之间导航 [重复]

将目标添加到 UIButton 以进行超级视图

UIButton在iOS7中没有显示突出显示

如何在 Tableview 单元格中获取 UIButton 的位置,并在 Swift 中添加目标?