Massive View Controller-IOS-解决方案


16

我确定每个新的iOS开发人员都会遇到以下问题:View Controller会很快因各种目的而挤满代码,很容易获得500多行代码。

这是两个基本和通用屏幕的外观:

1)表单屏幕: 在此处输入图片说明

2)表格视图控制器屏幕 在此处输入图片说明

到目前为止,我已经阅读了两种不同的解决方案:

  1. 第一个解决方案:https : //bendyworks.com/single-responsibility-principle-ios/。这是基于通知的,它将View Controller与(意图)View Model完全分开,从而减少了View Controller中的代码。我认为它具有破坏代码的缺点,类似于Go-To结构。看起来像这样: 在此处输入图片说明

  2. 第二种解决方案使拥挤的View Controller保持相同(按钮操作在VC中执行,依此类推)。但使用TPKeyboardAvoiding,BlocksKit之类的库或其他大多数基于类别的解决方案。使用第二种解决方案,可以大大减少代码,但是视图控制器仍然承担着很多责任。

您如何看待这些解决方案?哪个更好?有更好的吗?


5
我不能给,因为时间的一个很好的答案,但这个应该指向你在正确的方向。
Mike D

我的意图是收集尽可能多的好的答案,以最终克服许多新开发人员所遇到的问题。感谢您的链接,如果我发现新的东西,我一定会在这里发布。
拉维尔2014年

这里有一个很好谈安迪Matuschak脂肪视图控制器战斗https://realm.io/news/andy-matuschak-refactor-mega-controller/
托马斯·巴克

Answers:


6

我们可以使用MVVM解决此问题。

众所周知,Model-View-ViewModel或MVVM模式是UI设计模式。VM采用了有关从VC为UI准备模型数据的所有逻辑。

示例:
您具有带有某些字段的模型对象,您想要格式化其中的一些字段,进行计算并将其组合。

在MVC情况下,所有逻辑位于ViewController中。
在MVVM中,将其全部从VC移到VM。

VM将为UI准备所有数据,而VC只是这样设置。

(在VC类中)

self.descriptionLabel = self.viewModel.textForDescriptionLabel;

教程和主题:


3
虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
Bart van Ingen Schenau 2014年

我同意巴特的观点。如果没有其他人可以提供所有这些方法的摘要,那么我一理解并测试所有这些方法,便会立即做出一个总结。
拉夫尔2014年

2
@Ravul更新了答案
kaspartus 2014年

我已对您的回答投了赞成票,并感谢您的想法。我只是在阅读函数式反应式编程,这似乎是个好主意。我认为这个问题的答案是一个列举,它有以下几种方式解决问题的优点,缺点和至少一个概念图:1)反应性可可2)KVO 3)委托方法和4)经典方法编写一个View Controller。如果没有其他人在我测试所有这些方法后,我将立即编写它。如果与此同时我找到新的方法,那就更好了。
Ravul 2014年

3

之前,我不得不解开大型View Controller中的代码,这确实阻碍了我一开始浏览内容的能力。我意识到的一件重要事情是,仅View Controller的大小还不足以使事情分崩离析。具有1个大文件很复杂,而有一堆小文件也很复杂。这是重构将View Controller分成较小部分的一些有效理由:

MVC

View Controller所做的不应只是View和Model之间的连接粘合剂。如果您有大量的网络连接代码,图像处理代码等,则可以考虑将它们分成辅助类。

使用View Controller作为数据源的多个控件

如果屏幕上有一堆将View Controller作为数据源的控件,请考虑将它们分成单独的数据源对象,并让它们成为数据源。或者,您也可以将它们拆分为单独的View Controller(例如,如果View Controller除了其他控制器之外还具有表视图,则可以将其拆分为自己的Table View Controller类)。

重复码

如果您在不同的View Controller中具有完全相同的代码,请将其放在1个共享位置。这将使您的代码可重用,并有助于管理复杂性。

以下是一些其他建议,可最大程度地减少View Controller的复杂性:

故事板,而不是程序化

创建View元素需要很多代码,框架几何代码也需要很多工作。如果尚未考虑使用自动布局约束,则将尽可能多的View元素放入情节提要中。

不必要的代码/注释

另外,请确保删除不必要的代码/注释。很多时候,新的View Controller文件会附带您不使用的方法。如果您没有使用类似的方法,didReceiveMemoryWarning那么将其取出是安全的。另外,由于View Controller文件很大,有时删除旧代码或注释很可怕。不要推迟!它只会增加复杂性。

通知事项

要回答有关通知的问题:通知并不是用于所有事情的金锤。我发现由于1个特定操作而需要同时更新多个View Controller时,通知很有用。不过,请谨慎处理通知,过度使用通知可能会给您造成很大的痛苦,难以追踪它们。


2

他们称之为VIPER(视图,交互器,演示者,实体和路由)是一种特殊的体系结构。我将在这里尝试恢复您需要了解的内容:

视图

  • 它们是虚拟视图;
  • 包含对象,如UIView,UIViewController,UILabel等;
  • 等待主持人的内容;
  • 处理用户交互并将其传递给Presenter层。

主持人

  • 不知道UI对象;
  • View层获取输入;
  • 处理视图逻辑(add方法将显示其他屏幕);

路由

  • 处理导航逻辑和过渡动画;
  • 知道UINavigationController,UIWindow等对象;

因此,我认为您将在代码中进行清理:

  • 数据验证将移至Presenter层;

  • 导航将移至“线框”对象(“ 路由”层);

  • 遵循DRY原理拆分视图控制器;

  • 复杂的屏幕将具有两个或多个“视图”和“演示者”。

您应该看到有关VIPER体系结构的以下链接 http://mutualmobile.github.io/blog/2013/12/04/viper-introduction/

好幸运!


1
这种体系结构适用于小型应用程序吗?看起来您必须创建许多对象才能将其引入项目。
TomaszBąk2015年

是的,我同意它比传统的MVC更具针对性,但值得。您可以看到我今年创建的一个简单示例github.com/orafaelreis/cascavel Cascavel就像一个初始化VIPER项目的基础项目。
orafaelreis 2015年

优秀 !VIPER体系结构似乎完全是为了避免大型视图控制器的问题而设计的。
Christophe
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.