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
中的newValue
或didSet
中的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.
【讨论】:
在 SWIFT3 中selected
已重命名为 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的主要内容,如果未能解决你的问题,请参考以下文章