【问题标题】:Objective C Setter overriding in SwiftSwift中的Objective C Setter覆盖
【发布时间】: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 设置为任何内容...

标签: ios uibutton swift


【解决方案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
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 2017-08-21
    • 1970-01-01
    相关资源
    最近更新 更多