到目前,我们已经可以顺利接收到主题切换的通知,可是要所有子类都步伐一致的执行相同一个操作,我们可以通过一个协议来约定,这就是图中的主框架的protocol,这个协议中规定一个特定的方法,我们在父类中调用,子类中实现,当收到通知时,所有子类都将重新加载这个方法,如果我们将皮肤设置部分在这个方法中实现,那么正是我们想要的效果,所有皮肤设置都被重新加载了。协议如下:
/**
*这里定义主题的风格
*/
typedef enum {
dayTime=1,//白天
nightTime//夜间
}YHTopicModel;
@protocol YHTopicProcotol <NSObject>
//所有可以更换主题的界面必须遵守这个协议调用并实现如下方法
//将视图中控件的颜色摄住部分全部放在这个方法中
@required
-(void)useYHTopicToCreatViewWithModel;
@end
这时,就剩下我们这套逻辑的最后一步了,我们只需要将控件的颜色设置写在子类的协议方法中,并且,这些设置的数据来源于model这个模型,整个体系就完成了,子类实现方法如下:
-(void)useYHTopicToCreatViewWithModel{
//获取到模型
YHTopicColorManager * model = [YHTopicColorManager sharedTheSingletion];
//加载模型数据
[model getTopicModel];
//进行设置
self.view.backgroundColor = model.bgColor;
_schoolLabel.textColor = model.textColor;
_phoneLabel.textColor = model.textColor;
_secertLabel.textColor = model.textColor;
_reWriteSecretLabel.textColor = model.textColor;
_questionLabel.textColor = model.textColor;
_answerLabel.textColor = model.textColor;
_registBtn.backgroundColor = model.btnColor;
[_registBtn setTitleColor:model.btnTextColor forState:UIControlStateNormal];
}
我简单写了一些界面,不论任何地方切换皮肤,所有界面效果都会改变:
切换夜间模式前:
开启夜间模式后: