У меня есть расширения UIView, в этом расширении у меня есть один метод setDarkModeColor, как вызывать каждый раз, когда представление init - PullRequest
0 голосов
/ 24 октября 2019

У меня есть одна функция в расширении, которая изменяет цвет фона моего просмотра в темном и светлом режимах, мне нужно, чтобы этот метод вызывался каждый раз при инициализации.

Вот мой код, подобный этому:

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
            }
        } 
    }

Ответы [ 3 ]

0 голосов
/ 24 октября 2019

Вы не должны изменять поведение по умолчанию стандартного UIView или любого класса, который вы не написали или не являетесь владельцем. По крайней мере, расширения не место для этого. Хотя это возможно, это крайне плохая и крайне нежелательная практика переопределять существующие функции внутри расширения.

Вместо этого вы должны переопределить UIView ():

class MyView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        setDarkModeColor()
    }

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

    func setDarkModeColor()  {

    }
}
0 голосов
/ 24 октября 2019

Вы не можете. Вы не можете использовать расширение , чтобы вызвать метод. Вы можете внедрить этот метод, используя расширение, но вам придется вызывать его самостоятельно, явно, в каждом 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)
    }
}

Если назначить myCoolColor в качестве цвета фона представления, цвет изменится автоматически в зависимости от режима пользователя.

0 голосов
/ 24 октября 2019

о переопределении в расширении: официальные документы Apple

    NOTE

Extensions can add new functionality to a type, but they cannot override existing functionality.

Вы должны найти другой путь: (

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...