iOS开发之应用主题切换解决方案完整版(斯威夫特版)

  

本篇博客就来介绍一下iOS应用程序中主题切换的常规做法,当然本篇博客中只是提到了一种主题切换的方法,当然还有其他方法,在此就不做过多赘述了。本篇博客中所涉及的演示完全使用Swift3.0编写完成,并使用iOS的NSNotification来触发主题切换的动作。本篇博客我们先对我们的主题系统进行设计,然后给出具体实现方式。当然在我们设计本篇博客所涉及的演示时,我们要遵循“高内聚,低耦合”,“面向接口编程”、“便于维护与扩充”等特点。

  

本篇博客我们先看一下演示的运行效果,然后给出设计方案已经对应的类图,然后再根据设计的类图给出相应的代码实现。

  

<强>一、主题切换效果展示

  

先入为主,接下来我们先看一下本篇博客所涉及演示的最终运行效果。为了看到整体主题切换的效果,所以我们添加了一个主页以及主页进推去的子页面。另一个页面就是选择相应主题的页面,也就是下方你所看到的,该列表中提供了6种可选的主题,点击相应的主题即可切换到该主题上。

  

当然主题切换,意味着整个应用的风格都得改变,所以当修改完主题后,主页以及其子页面的主题也得随之改变。具体效果如下gif图所示,当然演示比较简单,但是麻雀虽小,五脏俱全,用来了解程序的主题切换足以。当然有更好的实现方式,欢迎留言交流。

  

 iOS开发之应用主题切换解决方案完整版(斯威夫特版)

  

<强>二、设计主题切换功能的整体结构

  

看完效果后,接下来我们就进入了设计阶段。根据上述演示的特点,我们先给出相应的类图,当然我们敲代码时要根据该类图进行实现。下方截图就是我们本篇博客主题切换工程的类图了。该类图中省略了一些细节,给出了核心的内容。接下来我们来详细的看一下下方这个类图的结构,如果下方的类图搞明白了,那么在下部分中看相应代码时,就会显得游刃有余了,因为我们的代码是按照下方的类图所实现的。只不过比下方类图更为详细。

  

接下来我们就来看一下类图的结构,我们就按照不同颜色的框逐一介绍,框中的内容算是一个模块。

  

下方类图红色框中就是我们的主题协议ThemeProtocol以及遵循该协议的所有主题。当然,依据“面向接口”编程的规则,外部所依赖的不是所有的主题类,而是主题协议ThemeProtocol。也就是ThemeManager类依赖于ThemeProtocol。而所有的主题类通过工厂类或者工厂方法间接的与ThemeManager。因为鉴于中迅速的枚举中可以添加相应的计算属性以及方法,所以我们可以使用相应的主题枚举来充当这个工厂类,当然下方类图中没有给出,这个要看具体的代码实现。

  

接下来我们就来看蓝色框,蓝色框中的SuperLabelClass是所有可以改变主题的标签的父类,也就是说在改变主题时,需要改变相应的标签就要继承该类。

  

<强>黑色框:该框中中则是SuperViewController及其子类,需要更换主题的风险都要继承自该基类。

  

绿框中则负责修改主题,其中根据细胞的类型来确定用户选择的是哪个主题。

  

<强> 该类以单例的形式存在,负责管理相应的主题,切换主题时,直接调用ThemeManager中的相应的方法即可。

  

上面只是简单的介绍一下类图,具体的还要看代码的实现。

  

 iOS开发之应用主题切换解决方案完整版(斯威夫特版)

  

<强>三,主题以及主题管理者的实现

  

看完运行效果以及设计类图,接下来我们就来一下具体的代码实现本部分我们就来看一下相应的主题类以及主题管理者的代码实现。下方会先给出主题协议以及各个主题类的实现,然后再给出主题工厂方法以及主题管理者的实现。

  

  

下方就是我们定义的主题协议,所有主题都要遵循该协议。因为本篇博客的演示在切换主题时只涉及到了三个元素,所以在我们的主题协议中有三个只读的计算属性与之对应。具体如下所示:

  

 iOS开发之应用主题切换解决方案完整版(斯威夫特版)

  

  

接下来我们就要看看各个主题的实现了,我们就以红色主题(RedTheme)为例.RedTheme要遵循ThemeProtocol,并且实现协议中规定的方法。在RedTheme中每个计算属性都会返回当前主题所对应的属性。具体如下所示。当然其他主题与下方的RedTheme类似,只是每个计算属性返回的值不同。

iOS开发之应用主题切换解决方案完整版(斯威夫特版)