Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 重写颜色类函数_Objective C_Iphone_Xcode_Swift_User Interface - Fatal编程技术网

Objective c 重写颜色类函数

Objective c 重写颜色类函数,objective-c,iphone,xcode,swift,user-interface,Objective C,Iphone,Xcode,Swift,User Interface,我正在尝试在Swift 1.2中为我的iOS应用程序实现一个“暗”模式功能,并且正在考虑编写UIColor的扩展或子类。我想知道是否可以覆盖UIColor.whiteColor()、UIColor.blackColor()和其他内置颜色。如果不是,那么有什么更好的方法来实现整个应用程序的黑暗模式?以下代码不能作为扩展 class func whiteColor() -> UIColor { return UIColor(...) } 因为它与UIColor中现有的whiteCol

我正在尝试在Swift 1.2中为我的iOS应用程序实现一个“暗”模式功能,并且正在考虑编写UIColor的扩展或子类。我想知道是否可以覆盖UIColor.whiteColor()、UIColor.blackColor()和其他内置颜色。如果不是,那么有什么更好的方法来实现整个应用程序的黑暗模式?以下代码不能作为扩展

class func whiteColor() -> UIColor {
    return UIColor(...)
}
因为它与UIColor中现有的whiteColor()声明冲突


谢谢大家!

最好的解决方案是编写一个存储颜色的ColorScheme类(比如labelColor、backgroundColor等)。当您将ColorScheme更改为“暗模式”时,只需设置新颜色并推送通知。您的视图控制器应该监听它,并将标签、背景等的颜色设置为新值。

另一种方法是编写您自己的UIColor扩展

使用Swift 3时,会相应地使用预定义的UIC颜色:

var myColor: UIColor = .white // or .clear or whatever
因此,如果你想要类似的东西,比如下面

var myColor: UIColor = .myCustomColor
…然后,您可以这样定义扩展:

extension UIColor
    {
    public class var myCustomColor: UIColor
        {
        return UIColor(red: 248/255, green: 248/255, blue: 248/255, alpha: 1.0)
        }
    }
事实上,苹果将白色定义为:

public class var white: UIColor

以下是您问题中“覆盖”部分的Swift 3答案。下面的代码段包含占位符。它将系统实现与您自己的交换

extension UIColor {

    // ******************************************************************
    // MARK: - Override black with own implementation
    // ******************************************************************

    override open class func initialize() {
        if self == UIColor.self {
            let blackMethod = class_getClassMethod(self, #selector(getter: black))
            let myBlackMethod = class_getClassMethod(self, #selector(getter: myBlack))
            method_exchangeImplementations(blackMethod, myBlackMethod)

            let whiteMethod = class_getClassMethod(self, #selector(getter: white))
            let myWhiteMethod = class_getClassMethod(self, #selector(getter: myWhite))
            method_exchangeImplementations(whiteMethod, myWhiteMethod)
        }
    }

    // for a light background
    open class var myBlack: UIColor {
        return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
    }

    // for a dark background
    open class var myWhite: UIColor {
        return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
    }
}

嗯,这听起来不是个好主意当whiteColor被覆盖时,如何将其设置回白色?你必须把原版的白色储存在某个地方。因此,为什么不将其存储在属性中,并将其命名为backgroundColor或其他名称,然后在模式更改为“深色”或“back”时进行更改。这只是因为文本标签和其他图标也需要更改颜色。例如,文本标签在白色背景上为黑色,在黑色背景上为白色。这就是为什么我不愿意这么做,因为我有很多全局变量。我明白了,但在UIColor中覆盖一种颜色不会更新屏幕上的所有元素。它们将副本存储在其属性中。妈妈。。。我会回答。。。
extension UIColor {

    // ******************************************************************
    // MARK: - Override black with own implementation
    // ******************************************************************

    static let classInit: Void = {
        let blackMethod = class_getClassMethod(UIColor.self, #selector(getter: black))
        let myBlackMethod = class_getClassMethod(UIColor.self, #selector(getter: myBlack))
        method_exchangeImplementations(blackMethod, myBlackMethod)

        let whiteMethod = class_getClassMethod(UIColor.self, #selector(getter: white))
        let myWhiteMethod = class_getClassMethod(UIColor.self, #selector(getter: myWhite))
        method_exchangeImplementations(whiteMethod, myWhiteMethod)
    }()

    // for a light background
    open class var myBlack: UIColor {
        return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
    }

    // for a dark background
    open class var myWhite: UIColor {
        return UIColor(red: <#T##CGFloat#>, green: <#T##CGFloat#>, blue: <#T##CGFloat#>, alpha: <#T##CGFloat#>)
    }
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    override init() {
        super.init()
        UIColor.classInit
    }

    ...

}