首页 > 解决方案 > UIView.appearance() 代理:是否可以使用枚举作为参数传递闭包?

问题描述

我有一种情况,我可能想根据视图的状态为视图设置四种不同的颜色。该视图位于与应用程序分开的框架中:

框架中定义的视图

@objc public enum TestViewState: Int {
    case firstState = 0
    case secondState
    case thirdState
    case fourthState
}

final public class TestView: UIView {
    public var state: TestViewState = .firstState
    
    @objc public dynamic var colorDependingOnState: ((TestViewState) -> UIColor)? {
        didSet {
            backgroundColor = colorDependingOnState?(state)
        }
    }
}

尝试从应用委托设置全局外观:

TestView.appearance().colorDependingOnState = { state in
    switch state {
    case .firstState:
        return .blue
    case .secondState:
        return .red
    case .thirdState:
        return .green
    case .fourthState:
        return .orange
    }        
}

执行此操作时,我收到此错误:

*** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“*** 非法属性类型,@?对于外观设置器,setColorDependingOnState:'

当然,我可以改为声明四个不同的动态属性,如下所示:

@objc public dynamic var colorDependingOnFirstState = UIColor.blue
@objc public dynamic var colorDependingOnSecondState = UIColor.red
@objc public dynamic var colorDependingOnThirdState = UIColor.green
@objc public dynamic var colorDependingOnFourthState = UIColor.orange

但我更喜欢使用枚举。有没有办法做到这一点?

谢谢您的帮助

标签: iosuiviewuiappearance

解决方案


推荐阅读