iOS 开发中,把一个比较大的控制器(ViewController)通过继承来把视图布局和事件分开,这样好不好?

2017-07-05 16:49:16 +08:00
 xiubin

在项目中经常会碰见一个比较大点的 ViewController,子视图可能比较多,而且会处理子视图的各种代理事件,vc 中还要处理逻辑,网络、数据等。

所以,我对于这种情况的解决办法一般是:

  1. 写一个基类,里面初始化各种子视图,并且约束布局。
  2. 继承基类,数据、事件、逻辑等处理

这样看着是很舒服、很清晰了,但是否违反继承的初衷?

4849 次点击
所在节点    程序员
27 条回复
cheng4741
2017-07-06 09:50:06 +08:00
不到万不得已别用继承,楼上说过的 extension,viewmodel 都是很好的方案,还可以另外写一个类处理一些逻辑,然后组合到 vc 中,各种 delegate 可以交给这个类去处理
holy_sin
2017-07-06 09:52:41 +08:00
rx.fuckEverything, you need it
blacklee
2017-07-06 09:56:02 +08:00
用 category 是一个很不错的解决方案,一个实例(左边是.m 文件的代码行数)

cdLI
2017-07-06 09:59:18 +08:00
推荐一篇文章:https://www.raywenderlich.com/132662/mvc-in-ios-a-modern-approach, 用此类方式,我目前在公司做的项目 viewController 里的代码没有超过 300 行的
blacklee
2017-07-06 10:04:29 +08:00
另外感觉其实代码多并不是非常的让人难受。
还是应该在命名、组织上面多下点功夫。比如前些年有一个思潮是「我们不写注释,因为我们的代码已经足够易读易解」。不过这个层次还是很难达到,我练习了几年,仍然感觉功力不够。
M80
2017-07-06 10:13:27 +08:00
纯吐槽:category 的方案不就是等于把垃圾扫到沙发底下,然后装作房间已经整洁了么?
这么说的原因是,即使分割成了多个 category,各个实现上都有可能存在互相依赖。
如果简单的 ViewController 可以做的事情是:做 ViewModel,提取 UITableView/UICollectionView 的 Adapter,上下文无关的地方,提取 Util 等等一些朴实的方法。
而复杂后,可以推荐使用 http://clean-swift.com/ 里这种类 VIPER 的做法。
(其实说到底还是经验和练习不够
sfz97308
2017-07-06 16:26:09 +08:00
不倾向于用继承和 Category。可以根据实际情况,拆成 Child View Controller,或者加一层 ViewModel

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/373266

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX