Swift - UIButton 覆盖 setSelected

Posted

技术标签:

【中文标题】Swift - UIButton 覆盖 setSelected【英文标题】:Swift - UIButton overriding setSelected 【发布时间】:2014-10-14 15:43:59 【问题描述】:

我正在 Swift 中创建一个 UIButton 子类,以在选择时执行自定义绘图和动画

在 Swift 中覆盖 ObjC 中的 - (void)setSelected:(BOOL)selected 的等价物是什么?

我试过了

override var selected: Bool

所以我可以实现一个观察者,但我得到了

Cannot override with a stored property 'selected'

【问题讨论】:

【参考方案1】:

像其他人提到的那样,您可以使用willSet 来检测更改。但是,在覆盖中,您不需要将值分配给 super,您只是在观察现有的更改。

您可以从以下游乐场观察到几件事:

    覆盖willSet/didSet 的属性仍会为get/set 调用super。因为状态从.normal 更改为.selected,所以您可以判断。 willSet 和 didSet 即使值没有变化也会被调用,因此您可能希望将selected 的值与willSet 中的newValuedidSet 中的oldValue 进行比较,以确定是否或不制作动画。
import UIKit

class MyButton : UIButton 

    override var isSelected: Bool 
        willSet 
            print("changing from \(isSelected) to \(newValue)")
        

        didSet 
            print("changed from \(oldValue) to \(isSelected)")
        
    


let button = MyButton()

button.state == .normal
button.isSelected = true // Both events fire on change.
button.state == .selected
button.isSelected = true // Both events still fire.

【讨论】:

SWIFT3selected 已重命名为 isSelected ...请更新 :) @Husam 已更新。 :)【参考方案2】:

你会这样做,例如这个:

class MyButton : UIButton 

    // ...

    override var isSelected: Bool 
        willSet(newValue) 
            super.isSelected = newValue;
            // do your own business here...
        
    

    // ...


【讨论】:

好的,即使没有 diegomen 建议的 public/internal 关键字,它也可以工作。我收到错误是因为我还没有将 包含在观察者中,我很傻……但我仍然不明白为什么它们是强制性的……【参考方案3】:

试试这个

override public var selected: Bool 
    willSet(selectedValue) 
        self.selected = selectedValue
        // Do whatever you want
    

【讨论】:

Xcode 给了我一个警告并建议用 internal 替换 public。您能否解释一下为什么需要 internal 关键字?谢谢。 使用 internal 你是说你可以从同一个模块访问 var 。你在这里获得了更多信息:codingricky.com/access-control-in-swift希望它有帮助:)【参考方案4】:

创建 IBAction 并检查是否以 Swift 语言选择按钮。

@IBAction func favoriteButtonAction(sender: UIButton) 

    // Save Data
    sender.selected  = !sender.selected;

    if (sender.selected)
    
        NSLog(" Not Selected");
    
    else
    
        NSLog(" Selected");
    


【讨论】:

以上是关于Swift - UIButton 覆盖 setSelected的主要内容,如果未能解决你的问题,请参考以下文章

Swift中的Objective C Setter覆盖

如何在 Tableview 单元格中获取 UIButton 的位置,并在 Swift 中添加目标?

Swift getter 覆盖非计算变量

所选 UIButton iOS 的区域

如何正确自动缩放 UIButton 和标题文本?

为啥 Swift4 会强制转换 UIButton 数组!到 [UIButton?] 类型?