封装一个自下而上弹出的多级功能菜单按钮列表

29. 八月 2017 iOS 0

1.设计思路

首先,这个问题主要是出在,多级菜单,这个上面,如果单一的一个actionsheet,这个其实很好做(传文字数组给View,点击后返回给目标按钮的index就可以了);多级的话,除了界面方面的文字需要改变,动画的升降要做一些处理,每级的按钮触发的操作也需要处理。封装给别人用怎么才会更加清晰。

这篇文章,我们就主要以多级菜单的交互来设计一下思路

看图那么就很简单了,就需要在一级菜单和二级菜单中有个更换的过程。那么我们将整个菜单的内容页面和里面的按钮看作一个可分割整体,则在更换的时候,我们只需要更换按钮即可!

那么思路就可以写成这样子的:

然后,我们思考下按钮之间的转换,很明显全部移除菜单1按钮,再生成菜单2按钮,更简单方便。

最后,一个问题,按钮的点击事件,我们该怎么处理。我个人还是比较推荐block,比起代理写起来更加的方便,你的controller也不需要额外再去遵循一个protocol,还有就是block很独立,你可以为这个按钮只在block里写他自己的点击处理。唯一需要注意的就是RetainCycle,熟练了就知道了。

2.代码实现

思路其实想的很清晰了,那么如何实现?

  1. View类:
    • 主要用于整个View的生成
    • 提供更新界面View的接口
    • 内部动画的切换
  2. Model类:对于使用者,只需要关心的是,按钮的属性(标题,样式,点击处理),所以:
    • 主要提供按钮的相关属性存储
    • 提供设置属性的相关接口

这么一来就比较明白了。废话不多说,直接上代码: 头文件CCButtomFunctionButtonModel.h

🌟 自定义一个block类型:CCButtomFunctionButtonClickedBlock来作为点击按钮存储的处理

🌟 只开放只读属性,初始化来处理按钮样式,单独方法设置点击处理,都是为了让其他开发使用起来更加简洁方便。原则就是你只暴漏给对开发者有用的接口

下面看下CCButtomFunctionView.h View 的头文件:

🌟 更加简洁明,一个初始化,一个初始化函数用来初始化,一个重置界面的方法。实现的方法就不写了,大概就是根据model数组来生成和重置这些按钮

举个例子,调用方法如下:(也就是需要在controller里写的)

🌟 这里其实写的有些复杂,还有更好更多样的书写方式。

3.总结

这个就是一个很正统的MVC模式,Controller更新ModelModel的变化又带动View,三者分离但是又紧密联系。

同时,扩展View的方法,可以带来更多的多样性,譬如,二级菜单界面上需要有更多的变化,可以扩展出方法来增加界面的元素。扩展Model也可以带来更多按钮的多样性。

这种思想,其实与“关注按钮封装在UIButton中”,最大的区别就是,业务逻辑由谁处理,是否可以将这种逻辑单独出来。关注按钮的逻辑就是关注,而菜单则是将逻辑交还给Controller

只是个人的一些小想法,欢迎交流讨论~😊

思考使人进步


发表评论