Подтвердить что ты не робот

Objective C Setter переопределяет в Swift

Мне нужно переопределить установщик выделенного объекта UIViews в моем пользовательском подклассе UIButton;

Цель 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];

}

Swift

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, чтобы получить тот же результат. любая идея?

4b9b3361

Ответ 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

Здесь есть пара ошибок, но это решение должно помочь вам...

В вашем случае, поскольку вы действительно не хотите, чтобы вычисленные значения для переменной выделены, но все, что вам нужно, это знать, когда выделено изменение, вы должны использовать willSet или didSet

для вашего случая, hasSet.

похоже на это

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 имеет несколько полезных советов о наборе, get, didSet и willSet, около страницы 250 ish.

Сообщите мне, будет ли ваша ошибка оставаться (и если вам стоит разместить эту переменную, а также заголовки и т.д., может быть недостаточно информации. Кроме того, вы используете xcode6-beta4?)

Ответ 3

Вы используете computed properties вместо этого stored property. Поскольку нет UIColorFromRGB, предоставленного в swift, поэтому я написал мой

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)
    )
 }
}