Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.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
Ios 我有UIView扩展,在这个扩展中,我有一个方法setDarkModeColor每次初始化视图时如何调用_Ios_Swift_Ios13 - Fatal编程技术网

Ios 我有UIView扩展,在这个扩展中,我有一个方法setDarkModeColor每次初始化视图时如何调用

Ios 我有UIView扩展,在这个扩展中,我有一个方法setDarkModeColor每次初始化视图时如何调用,ios,swift,ios13,Ios,Swift,Ios13,我在扩展中有一个函数,在黑暗模式和光明模式下更改我的视图背景颜色,每次初始化视图时我都需要调用这个方法 我的代码如下: extension UIView{ func setDarkModeColor() { if #available(iOS 12.0, *) { if self.traitCollection.userInterfaceStyle == .light{ if sel

我在扩展中有一个函数,在黑暗模式和光明模式下更改我的视图背景颜色,每次初始化视图时我都需要调用这个方法

我的代码如下:

extension UIView{
        func setDarkModeColor()  {
            if #available(iOS 12.0, *) {
                if self.traitCollection.userInterfaceStyle == .light{
                    if self.backgroundColor == UIColor.black{
                        self.backgroundColor = .white
                    }
                }else{
                    if self.backgroundColor == UIColor.white{
                        self.backgroundColor = .black
                    }
                }
            } else {
                // Fallback on earlier versions
            }
        } 
    }

关于在扩展中重写:


您应该找到另一种方法:(

您不应该更改标准UIView或任何未编写或未拥有的类的默认行为。至少,扩展不是这样做的地方。尽管有可能,但重写扩展中的现有函数是非常糟糕且极不鼓励的做法

相反,您应该重写UIView():


不能。不能使用扩展导致调用方法。可以使用扩展注入此方法,但必须在每个UIView中显式地自己调用

无论如何,你不需要这种方法。如果你想给UIView一个响应暗/光模式的背景色,那么给它一个响应暗/光模式的背景色。在iOS 13中,颜色具有这种能力;以这种方式配置的颜色将自动响应暗/光模式。你可以创建这样一种颜色作为命名颜色在资产目录中,也可以通过调用
init(dynamicProvider:)
在代码中构造它。例如:

let myCoolColor = UIColor { tc in
    switch tc.userInterfaceStyle {
    case .dark:
        return UIColor(red: 0.3, green: 0.4, blue: 0.4, alpha: 1)
    default:
        return UIColor(red: 0, green: 0.1, blue: 0.1, alpha: 1)
    }
}

如果您将
myColColor
指定为视图的背景色,则颜色将根据用户的模式自动更改。

您应该在每个视图上为每个背景添加特定的颜色,就像Apple建议的那样(一个用于暗模式,一个用于亮模式):。当您在模式之间切换时,操作系统将自动进行更改。是的,我们可以使用这种方法,但在激动人心的应用程序中,我们可以遵循这个过程,然后是漫长的过程。因此,我认为如果我们使用扩展,那么这种方法会更好。您还可以创建UIView的子类并重写init语句,以确保调用此方法。@Leo Y我们可以这样做,但它改变了所有swift文件、故事板和Xib。所以这可能是一个漫长的过程。所以我们可以使用扩展找到最佳解决方案。
class MyView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        setDarkModeColor()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        setDarkModeColor()
    }

    func setDarkModeColor()  {

    }
}
let myCoolColor = UIColor { tc in
    switch tc.userInterfaceStyle {
    case .dark:
        return UIColor(red: 0.3, green: 0.4, blue: 0.4, alpha: 1)
    default:
        return UIColor(red: 0, green: 0.1, blue: 0.1, alpha: 1)
    }
}