适用于iOS的Swift App广泛主题

Bog*_*dan 6 themes load ios swift

我有一个解决方案,但对我来说,它看起来像一个非常hacky,不是很优雅的解决方案.但我搜索,搜索,找不到任何其他东西.也许有人可以提出更好的解决方案?

所以,问题是,我想要一个文件,我定义所有的颜色和字体,以及我的应用程序.我创建了一个带有一堆静态变量的Style结构,如下所示:

struct Style{
    static var colorA = UIColor.redColor()
    static var colorB = UIColor.blackColor()
    static var titleText = colorA
    static var mainText = colorA
    static var backColor = colorB
    static var callBackColor = backColor
}
Run Code Online (Sandbox Code Playgroud)

我必须使用start var,因为我希望能够在新变量的定义中引用先前声明的变量,这是我能够使其工作的唯一方法.

总的来说上面运作良好 例如,在我的代码中,我总是可以引用颜色或其他意图Style.titleText.所以它看起来像一个很好的解决方案

但是,我决定添加主题.为此,我添加了一个名为的静态方法theme1,从上面覆盖一些静态变量,并添加了一个主题选择器.很简单:

struct Style{
    static var colorA = UIColor.redColor()
    static var colorB = UIColor.blackColor()
    static var titleText = colorA
    static var mainText = colorA
    static var backColor = colorB
    static var callBackColor = backColor

    static func themeSelector(){
        // some logic loading defaults and running appropriate theme function bellow
    }

    static func theme1(){
        backColor = UIColor.greenColor()
        callBackColor = UIColor.greenColor()
    }
}
Run Code Online (Sandbox Code Playgroud)

但后来我遇到了一个问题,怎么解雇themeSelector?我尝试重写初始化方法并将我的结构转换为类,但初始化函数不会及时触发,因此一些依赖于其声明语句中的样式设置的变量不会加载更新的主题设置,而是加载默认值.

我也尝试将调用放入didFinishLaunchingWithOptionsAppDelegate 的方法中,但结果与上面相同.

我最终做了一些非常愚蠢的事情,在我的ViewController类中声明一个变量,如下所示:

var loadThem: Bool = {
    Style.themeSelector()
    return true
}()
Run Code Online (Sandbox Code Playgroud)

这有效,但......真的,这是最好的方式.是否有更好的方法来制作主题?是否有更好的方法在类或结构的加载时调用函数(从Swift 1.2开始,覆盖加载方法不再是一个选项).那么,有更好的方法吗?