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 如你所见,我继承自 UIViewUIView 类中没有属性 highlighted。所以你不能覆盖它。如果你的类是自定义视图的子类或另一个具有highlighted 属性的类,而只有你可以覆盖它。因为你的类是UIButton 的子类,所以你需要override

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

Swift 3.0 中的 Objective C 代码

在 Swift 项目中使用 Objective C 类中的 Swift 类

在 Swift 项目中使用 Objective C 类中的 Swift 类

无法从Objective C中的swift类调用方法

Swift 项目中的 Objective C pod - 正确的桥接头?

Swift 项目中的 Objective C pod - 正确的桥接头?