web-dev-qa-db-fra.com

Échec du rendu de l'instance de IB Designables

J'ai un cadre dynamique mixte Objective-C et Swift. Et le cadre mixte était lié à deux cadres dynamiques purs Objective-C.

Lorsque j'ai essayé de marquer une classe dans le cadre mixte avec IB Designable et d'utiliser cette classe dans le storyboard ou dans le pli, le Xcode dit toujours que le rendu de l'instance a échoué.

Et il y avait le message d'erreur:

IB Designables: Impossible de restituer une instance de WZUITokenField: dlopen (WZUIKit.framework, 1): Bibliothèque non chargée: /Library/Frameworks/WZFoundation.framework/WZFoundation Référencé par: WZUIKit.framework Raison: image non trouvée

IB Designables: Échec de la mise à jour du statut de présentation automatique: dlopen (WZUIKit.framework, 1): Bibliothèque non chargée: @ rpath/WZFoundation.framework/WZFoundation Référencé par: WZUIKit.framework Raison: image non trouvée

Le framework WZUIKit est un framework mixte Objective-C et Swift et la WZFoundation est purement Objective-C.

De plus, tous ces éléments fonctionnent sur l’appareil ou sur le simulateur.

55
WeZZard

Enfin, j'ai résolu ce problème en ajoutant $(CONFIGURATION_BUILD_DIR) dans le champ Runpath Search Paths du paramètre de génération de la cible.

De plus, vous devrez peut-être effectuer certaines étapes supplémentaires avec votre Xcode.

  1. Effacer les données dérivées Xcode pour le projet. Ils sont dans ~/Library/Developer/Xcode/DerivedData
  2. Nettoyez votre version actuelle en appuyant sur K
  3. Construisez votre projet
  4. Dans le storyboard, allez au menu Editor et faites Refresh All Views; attendez que la construction soit terminée et que les erreurs disparaissent

crédit de @Mojtaba

76
WeZZard

Si vous rencontrez le même problème lors de la création d'une application Mac, l'ajout de @loader_path/../Frameworks à Runpath Search Paths a résolu ce problème.

15
Alex Young

pour moi, cela fonctionne pour fermer xcode et le rouvrir à nouveau. Pas d'erreurs après .. .. Merci.

13
Gabriel

Intéressant.

Premièrement, la réponse de WeZZard m'a permis d'aller dans la bonne direction mais n'était pas exactement ma solution.

Dans mon projet iOS, quelque chose avait remplacé le champ Runpath Search Paths dans ma cible. Cela ressemblait à ceci:

LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";

J'ai essayé sa solution d'ajouter la $(CONFIGURATION_BUILD_DIR) mais cela n'a pas fonctionné pour moi. Comme cela ne fonctionnait pas, par habitude, j'ai simplement supprimé l'entrée de configuration (pour revenir aux valeurs par défaut du projet). Quand je l'ai fait, il s'est réinitialisé à ceci:

LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks'

qui, si je fouille dans mes fichiers xcconfig, semble provenir des Cocoapods.

Il semble identique à Alex que le @loader_path est la clé, mais le chemin est légèrement différent sur iOS que sur Mac OS X.

4
hsoi

J'ai eu le même problème Dans Xcode 6.4, l'ajout de l'appartenance à la cible Test au storyboard a corrigé ces erreurs pour moi. 

De plus, ma cible de test a @loader_path/Frameworks défini dans Runpath Search Paths pour la cible de test et non dans la cible d'origine.

enter image description here

4
CalZone

Je viens de comprendre une autre raison dans mon cas: 

Lorsque j'ai utilisé 'Editor -> Debug Selected Views', j'ai constaté qu'il se bloquait, car j'utilisais CoreGraphics pour créer une image et l'utiliser comme image d'arrière-plan pour un bouton:

class func imageWithColor(color: UIColor, size: CGSize) -> UIImage {

    let rect = CGRectMake(0.0, 0.0, size.width, size.height);
    UIGraphicsBeginImageContextWithOptions(rect.size, false, 0.0);
    let context = UIGraphicsGetCurrentContext();    // It's alraedy nil here :(

    CGContextSetFillColorWithColor(context, color.CGColor);
    CGContextFillRect(context, rect);

    let image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;

}

La raison en est simplement que la taille est (0.0, 0.0). Pourquoi donc? j'appelle

super.setBackgroundImage(UIImage.imageWithColor(bgColor, size: self.bounds.size), forState: .Normal)

Mais dans IB, self.bounds.size est toujours égal à 0! J'ai donc changé une ligne:

let rect = CGRectMake(0.0, 0.0, max(size.width, 1.0), max(size.height, 1.0));

Et maintenant ça marche :)

Apple devrait fournir une liste de choses à faire et à ne pas faire concernant l'IB ...

3
benjamin.ludwig

J'ai aussi expérimenté cela sur un projet Mac et Xcode 7.3.1. Dans mon cas, la structure référencée dans le message d'erreur Echec du rendu n'était pas du tout liée au dessin. 

Le simple fait de passer à l'onglet Général/Liés de la cible et aux bibliothèques de la cible et de changer le statut de la structure en cause de obligatoire à facultatif a permis à IBDesignables de se mettre à jour et de dessiner correctement dans IB.

statut optionnel

2
Doug Hanson

J'ai eu ce problème dans un projet OS X.

Dans mon cas, le problème était un vieux projet ( NMSSH ) contenant une cible de structure avec de mauvais paramètres de construction. Plus précisément:

  • INSTALL_PATH a été défini sur @executable_path/../Frameworks, mais le paramètre correct est /Library/Frameworks
  • SKIP_INSTALL n'a pas été défini et sa valeur par défaut est NO, mais le paramètre correct est YES
  • DYLIB_INSTALL_NAME_BASE n'a pas été défini, mais le paramètre correct est @rpath

Notez que tous les paramètres corrects sont ceux que vous obtenez automatiquement pour une cible de structure nouvellement créée.

Après avoir modifié les paramètres avec les valeurs correctes, Xcode a pu charger ma vue @IBDesignable dans le storyboard.

1
rob mayoff

Dans mon cas, je faisais le suivant dans les méthodes initWithFrame/initWithCoder pour créer la vue:

className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];

Mais il semble que je n'étais pas censé utiliser le paquet principal mais le paquet de la classe. J'ai donc remplacé ce code par ce qui suit:

bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];

Je pensais que cela pourrait peut-être aider quelqu'un.

1
jmoukel

Effacer les données dérivées. Quittez Xcode, Rouvrez à nouveau.

0
Vineesh TP

Dans mon cas, c'est à l'intérieur du pod privé. Xcode version 10.3 (10G8) produce rendering error

La colution est très simple dans mon cas - J'oublie juste d'ajouter public entre-deux de @IBInspectable var

bonne variante:

import UIKit

@IBDesignable public class BorderedView: UIView {
    @IBInspectable public var borderColor: UIColor? = UIColor.white {
        didSet {
            if let actualColor = borderColor {
                layer.borderColor = actualColor.cgColor
            } else {
                layer.borderColor = UIColor.white.cgColor
            }

            setNeedsDisplay()
        }
    }
    @IBInspectable public var borderWidth: CGFloat = 1 {
        didSet {
            layer.borderWidth = borderWidth
            setNeedsDisplay()
        }
    }
}

P.S .: Editeur -> Déboguer les vues sélectionnées n'a rien fait dans mon cas

P.S.2: Le pod AlignedCollectionViewFlowLayout de la dépendance de mon pod privé et sans aucun rapport avec ce problème.

P.S.3: La question est toujours là

0
WINSergey

J'ai frappé cette erreur sur un framework contenant IBDesignables.

Je devais ajouter $(FRAMEWORK_SEARCH_PATHS) au paramètre LD_RUNPATH_SEARCH_PATHS sur ma cible de structure.

Après la mise à jour du paramètre de chemin d'exécution, de la construction et de l'actualisation de la vue dans le storyboard, l'erreur a disparu. N'a même pas eu à nettoyer le dossier de construction.

 enter image description here

0
Scott Marchant

J'ai eu une erreur similaire provoquée par les vues de mon Framework n'ayant pas d'initialisateurs publics:

public override init(frame: CGRect) {
    super.init(frame:frame)
    commonInit()
}

required public init(coder: NSCoder) {
    super.init(coder: coder)
    commonInit()
}
0
Leon

Suivez les étapes ci-dessous:

  1. S'il y a des conflits dans le storyboard, résolvez-les correctement, vérifiez si le fichier XML est correctement validé (c'est l'étape principale).
  2. Nettoyez le projet.
  3. Supprimer le dossier de données dérivé.
  4. Quittez Xcode et redémarrez-le. (Je devais le faire deux fois.)
0
komall