web-dev-qa-db-fra.com

Comment corriger l'attribut "'@IBInspectable' n'a pas de sens sur une propriété qui ne peut pas être représentée dans Objective-C"

Dans Xcode 9 et Swift 4 je reçois toujours cet avertissement pour certaines propriétés IBInspectable:

    @IBDesignable public class CircularIndicator: UIView {
        // this has a warning
        @IBInspectable var backgroundIndicatorLineWidth: CGFloat? {  // <-- warning here
            didSet {
                backgroundIndicator.lineWidth = backgroundIndicatorLineWidth!
            }
        }

    // this doesn't have a warning
    @IBInspectable var topIndicatorFillColor: UIColor? {
        didSet {
            topIndicator.fillColor = topIndicatorFillColor?.cgColor
        }
    }
}

Y a-t-il un moyen de s'en débarrasser ?

16
Adrian

Peut être.

L'exact erreur (pas avertissement) que j'ai obtenu en faisant un copier/coller de la classe CircularIndicator: UIView est:

La propriété ne peut pas être marquée @IBInspectable car son type ne peut pas être représenté dans Objective-C

Je l'ai résolu en faisant ce changement:

@IBInspectable var backgroundIndicatorLineWidth: CGFloat? {  // <-- warning here
    didSet {
        backgroundIndicator.lineWidth = backgroundIndicatorLineWidth!
    }
}

À:

@IBInspectable var backgroundIndicatorLineWidth: CGFloat = 0.0 {
    didSet {
        backgroundIndicator.lineWidth = backgroundIndicatorLineWidth!
    }
}

Bien sûr, backgroundIndicator n'est pas défini dans mon projet.

Mais si vous codez contre didSet, il semble que vous ayez juste besoin de définir une valeur par défaut au lieu de rendre backgroundIndicatorLineWidth facultatif.

26
dfd

Ci-dessous deux points pourraient vous aider

  1. Comme il n'y a pas de concept d'optionnel dans l'objectif C, IBInspectable optionnel produit donc cette erreur. J'ai supprimé l'option et fourni une valeur par défaut.

  2. Si vous utilisez certains types d'énumérations, écrivez @objc avant cette énumération pour supprimer cette erreur.

7

Rapide - 5

//Change this with below
@IBInspectable public var shadowPathRect: CGRect!{
    didSet {
        if shadowPathRect != oldValue {
            setNeedsDisplay()
        }
    }
}

À

@IBInspectable public var shadowPathRect: CGRect = CGRect(x:0, y:0, width:0, height:0) {
    didSet {
        if shadowPathRect != oldValue {
            setNeedsDisplay()
        }
    }
}
3
Shakeel Ahmed