J'ai besoin de remplacer le setter de la propriété mise en évidence UIViews dans ma sous-classe UIButton personnalisée;
Objectif c
@property(nonatomic,getter=isHighlighted) BOOL highlighted;
remplacé comme ceci
- (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
J'ai essayé:
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
}
}
}
Comment et où implémenter cette méthode dans Swift pour obtenir le même résultat. Une idée?
Dans Swift la solution ci-dessus a fonctionné pour moi, mais je devais omettre le 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()
}
}
}
}
Il y a quelques erreurs ici, mais cette solution devrait vous aider ...
Dans votre cas, puisque vous ne voulez pas vraiment de valeurs calculées pour la variable mise en évidence , mais plutôt tout ce que vous voulez, c'est de savoir une fois mis en évidence modifié, vous devez utiliser willSet ou didSet
pour votre cas, didSet .
ça ressemble à ça
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()
}
}
}
Gardez à l'esprit que la valeur initiale est définie sur false MAIS l'initialisation de la variable n'appelle pas le bloc didSet (je ne pense pas), donc initialisez par défaut cette vue avec backgroundColor noir ... ou autre chose.
le Swift ibook a quelques bons conseils sur set, get, didSet et willSet, autour de la page 250 ish.
Faites-moi savoir si votre erreur persiste (et si c'est le cas, vous devriez peut-être publier lorsque vous définissez cette variable et les en-têtes de classe et d'autres choses, peut-être pas assez d'informations. De plus, utilisez-vous xcode6-beta4?)
Vous utilisez computed properties
utilisez plutôt stored property
. Comme il n'y a pas de UIColorFromRGB
fourni dans Swift donc j'ai écrit le mien
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)
)
}
}