Swift中的Objective C Setter覆盖
Posted
技术标签:
【中文标题】Swift中的Objective C Setter覆盖【英文标题】:Objective C Setter overriding in Swift 【发布时间】:2014-07-28 22:18:58 【问题描述】:我需要在我的自定义 UIButton 子类中覆盖 UIViews 高亮属性的设置器;
目标 C
@property(nonatomic,getter=isHighlighted) BOOL highlighted;
像这样被覆盖
- (void) setHighlighted:(BOOL)highlighted
[super setHighlighted:highlighted];
if (highlighted)
self.backgroundColor = UIColorFromRGB(0x387038);
else
self.backgroundColor = UIColorFromRGB(0x5bb75b);
[super setHighlighted:highlighted];
斯威夫特
var highlighted: Bool
我试过了:
var highlighted: Bool
get return false
set
if highlighted
self.backgroundColor = UIColor.whiteColor()
//Error "Use unresolved identifier 'self'"
I can't set the background color from value type in here
, can't call self.backgroundColor in this value type ,
can't call super too because this is a value type , doesn't work
在 Swift 中应该如何以及在何处实现此方法以获得相同的结果。有什么想法吗?
【问题讨论】:
什么不起作用?您没有将 backgroundColor 设置为任何内容... 【参考方案1】:在 Swift 中,上面的解决方案对我有用,但我不得不省略 Bool = true:
import UIKit
class CustomUIButtonForUIToolbar: UIButton
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func drawRect(rect: CGRect)
// Drawing code
super.drawRect(rect)
self.layer.borderColor = UIColor.blueColor().CGColor
self.layer.borderWidth = 1.0
self.layer.cornerRadius = 5.0
self.clipsToBounds = true
self.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)
self.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Highlighted)
override var highlighted: Bool
didSet
if (highlighted)
self.backgroundColor = UIColor.blueColor()
else
self.backgroundColor = UIColor.clearColor()
【讨论】:
【参考方案2】:这里有一些问题,但这个解决方案应该可以帮助你......
在您的情况下,由于您并不真正想要变量 highlighted 的计算值,而是您只想知道突出显示何时更改,您应该使用 willSet 或 didSet
对于您的情况,didSet。
看起来像这样
var highlighted:Bool = false
didSet
// You can use 'oldValue' to see what it used to be,
// and 'highlighted' will be what it was set to.
if highlighted
self.backgroundColor = UIColor.whiteColor()
else
self.backgroundColor = UIColor.blackColor()
请记住,初始值设置为 false 但初始化变量不会调用 didSet 块(我不认为),因此默认使用 backgroundColor black... 或其他方式初始化此视图。
Swift ibook 在第 250 页左右提供了一些关于 set、get、didSet 和 willSet 的好技巧。
如果您的错误仍然存在,请告诉我,(如果是这样,您可能应该在设置此变量和类头文件时发布,可能信息不足。另外,您使用的是 xcode6-beta4 吗?)
【讨论】:
仍然收到相同的错误“使用未解析的标识符'self'”,您自己尝试过您的代码吗?我的班级没有发生什么事情,它只是 UIButton 子类,我只是将您的代码粘贴在空白区域,当我尝试在 if 语句中设置背景时它给出错误。而且,是的,我正在使用 beta 4。 好的,它现在可以工作了,我将代码放在 init 方法的顶部,它确实工作了。感谢您的回答。我不知道为什么它应该在 init 之前被覆盖。另外你必须在它之前添加覆盖关键字, 是的,我自己(在 UIView 上)运行了这段代码......哦。但我没有意识到您使用的是 UIButton 子类(我的错)。 UIButton 已经有一个名为“highlighted”的变量,因此,如果您希望在自己的子类中具有突出显示的 var,则有必要覆盖它。 也可以写self.backgroundColor = .whiteColor()
【参考方案3】:
您正在使用computed properties
而不是使用stored property
。因为swift 中没有提供UIColorFromRGB
,所以我写了我的
class ViewSubClass:UIView
var highlighted: Bool = true
didSet
if (highlighted)
self.backgroundColor = UIColorFromRGB(0x387038);
else
self.backgroundColor = UIColorFromRGB(0x5bb75b);
init(frame: CGRect)
super.init(frame: frame)
func UIColorFromRGB(rgbValue: UInt) -> UIColor
return UIColor(
red: CGFloat((rgbValue & 0xFF0000) >> 16) / 255.0,
green: CGFloat((rgbValue & 0x00FF00) >> 8) / 255.0,
blue: CGFloat(rgbValue & 0x0000FF) / 255.0,
alpha: CGFloat(1.0)
)
【讨论】:
您必须在 var 关键字之前添加 override 关键字。请编辑您的代码。 @Ezimet 我已经测试过它工作正常的代码。无需添加override
关键字
这很奇怪,编译器警告“覆盖声明需要覆盖关键字”,这是一个红色错误,我必须添加覆盖关键字。
@Ezimet 如你所见,我继承自 UIView
。UIView
类中没有属性 highlighted
。所以你不能覆盖它。如果你的类是自定义视图的子类或另一个具有highlighted
属性的类,而只有你可以覆盖它。因为你的类是UIButton
的子类,所以你需要override
它以上是关于Swift中的Objective C Setter覆盖的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 项目中使用 Objective C 类中的 Swift 类
在 Swift 项目中使用 Objective C 类中的 Swift 类