适用于iOS的Swift App广泛主题

时间:2015-05-06 00:45:38

标签: ios swift load themes

我有一个解决方案,但对我来说,它看起来像一个非常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
}

我必须使用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()
    }
}

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

我也尝试将调用放入AppDelegate的didFinishLaunchingWithOptions方法,但结果与上面相同。

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

var loadThem: Bool = {
    Style.themeSelector()
    return true
}()

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

0 个答案:

没有答案