在单个UIViewController中切换不同展示模式的最优方案是什么?
推荐实现方案
优先选择在方案3的基础上做逻辑拆分,既可以规避VC臃肿问题,也不需要额外处理多组件的数据源同步逻辑,适配你的同页切换需求:
- 先将两种展示样式的视图分别封装为独立的组件,比如列表视图
ListView、地图视图MapView,所有和对应样式相关的布局、元素渲染、交互事件处理逻辑全部内聚在各自的视图类内,不要堆叠在视图控制器中 - 视图控制器仅持有统一的数据源、当前选中的模式状态,初始化时将两个视图以相同的frame添加到父视图上,通过
isHidden属性控制显隐即可,不需要频繁执行添加/移除子视图的操作 - 数据源更新时,视图控制器直接将最新数据同步给两个视图组件即可,不需要关心各自的渲染逻辑
mode按钮点击时仅需修改模式状态、切换两个视图的显隐状态即可
现有方案对比
- 方案1:不适用于你的场景,两个子VC共用一套数据源时,额外需要做状态同步、双份数据源更新的逻辑,反而会提升复杂度
- 方案2:频繁添加/移除子视图会多次触发视图生命周期回调,性能弱于显隐切换,同时容易出现视图层级管理bug,不推荐
- 方案3:只要做好视图层的独立封装,完全可以解决VC臃肿问题,是当前场景下投入产出比最高的方案
可选优化点
如果你的两种展示样式可以通过UICollectionView实现,完全可以只用一个UICollectionView,通过切换不同的Layout实现样式切换:列表样式用UICollectionViewFlowLayout,其他样式用对应的自定义Layout,切换时调用setCollectionViewLayout:animated:即可,连视图显隐都不需要,代码更简洁。
所有用户交互(比如点击列表项、点击地图标注)都通过闭包或代理抛给视图控制器处理,视图组件不处理业务逻辑,后续复用性更高。
内容的提问来源于stack exchange,提问作者mamba4ever
相关产品推荐
相关产品推荐

