iOS Swift 5 无法在自定义视图中禁用按钮

iOS Swift 5 unable to disable button in custom view

我有一个带有两个按钮的自定义视图,自定义视图有一个关联的 UIView class 文件。

想法是 button2 被禁用,直到 button1 被按下,然后一旦它 (button2) 被按下 button2 被禁用。

请注意,禁用我的意思是交互被禁用并且按钮是灰色的。奇怪的是交互 is 被禁用但是按钮 isint 变灰了

我正在使用 button2.isEnabled = false 当按钮是主视图的一部分时,它工作得很好,但是由于将按钮重构为自定义视图,我似乎无法禁用按钮(按钮变灰) .自定义视图提供了很好的关注点分离,所以我不想丢失它。

我似乎能够根据需要设置按钮的标题,所以我相信我已经正确定义了按钮 IBOutlet

按钮的 @IBAction 被正确触发。

有趣的是,即使在 属性 检查器中取消选择了 enabled,界面构建器中的按钮仍处于 non-greyed 退出状态。

谢谢

class ControlPanelView: UIView {   
    @IBOutlet var contentView: UIView!
    
    @IBOutlet weak var button1: UIButton!
    @IBOutlet weak var button2: UIButton!
    
    @IBAction func button1Action(_ sender: Any) {
        button2.isEnabled = true
    }
    
    @IBAction func button2Action(_ sender: Any) {
        button2.isEnabled = false
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }
    
    private func commonInit() {
        Bundle.main.loadNibNamed("ControlPanelView", owner: self, options: nil)
        addSubview(contentView)
        contentView.frame = self.bounds
        contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
        
        // button is still enabled
        button2.isEnabled = false
    }
}

请注意,这是 Xcode 11 中针对 iOS 10 及更高版本的 Storyboard 项目。

我在Xcode试过了。有同样的问题。我用这个解决了这个问题

private func commonInit() {
    ...
    // button is still enabled
    DispatchQueue.main.asyncAfter(deadline: .now() + 0.001) {
        button2.isEnabled = false
    }
}

如果有帮助请告诉我。

我认为您的代码没有任何问题。

当你select一个颜色不是默认为UIButton时,你还需要select一个颜色为Disabled状态。

Select 默认文本颜色:

将状态配置更改为禁用并select 文本颜色:

现在,在 Storyboard 中,您可以在切换“已启用”复选框时看到不同之处:

(我 select 为禁用设置了蓝色只是为了说明它没有使用“默认灰色”)