web-dev-qa-db-fra.com

IB Designables: échec du rendu et de la mise à jour du statut de présentation automatique

J'ai une vue personnalisée (xib) qui a une UIButton à l'intérieur, j'ai créé id IBDesignable en procédant comme suit:

UserView.Swift

import UIKit

@IBDesignable
class UserView: UIView {

    @IBOutlet var view: UIView!
    @IBOutlet weak var userButton: UIButton!

    override init(frame: CGRect) {
        super.init(frame: frame)
        load()

    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        load()
    }

    fileprivate func load() {
        Bundle.main.loadNibNamed("UserView", owner: self, options: nil)
        addSubview(view)
        self.frame = bounds
    }

}

UserView.xib

  • Ajout du UIButton et définition des contraintes
  • Définissez le propriétaire du fichier: UserView 

Storyboard

J'ai ajouté un UIView à un Bar Button Item et attribué une classe UserView mais rien ne rend, et j'ai eu l'erreur de construction suivante:

erreur: IB Designables: échec du rendu et de la mise à jour de l’état de la présentation automatique pour FoodViewController (bR3-Kz-wX7): l'agent a généré une exception.

Mon environnement actuel: Xcode 9 , Swift 4

16
Jonathan Solorzano

J'ajoute ce script à la fin de ma Podfile et exécute à nouveau pod install. Je pourrais donc construire normalement mon projet.

post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
        config.build_settings.delete('CODE_SIGNING_ALLOWED')
        config.build_settings.delete('CODE_SIGNING_REQUIRED')
    end
end
29
Haroldo Gondim

Je viens d'avoir exactement le même problème, et la seule chose qui a fonctionné pour moi a été au lieu d'utiliser le Bundle principal, je devais obtenir le Bundle pour le Nib que je voulais. Essentiellement changeant:

Bundle.main.loadNibNamed("UserView", owner: self, options: nil)

À:

let bundle = Bundle(for: UserView.self)
bundle.loadNibNamed("UserView", owner: self, options: nil)

Ce qui est bizarre, car dans mon cas, lorsque je comparais les deux ensembles lors de l'exécution dans LLDB, ils étaient identiques (le nom de la classe est différent mais le reste de ma configuration était identique à l'OP).

 lldb screenshot

14
Mike Velu

Cette question est liée à cette réponse. Vérifiez les deux.
Echec du rendu de l'instance de ClassName: l'agent a lancé une exception de chargement d'exception dans le paquet

Ligne de fond

Assurez-vous que votre fichier xib ne contient aucun point de vente orphelin. Vérifiez chaque vue/élément de la plume pour une sortie, puis retirez-le et rajoutez-le.

 A nib subview with an outlet

Pour moi, ils étaient des sorties orphelines. Il semble que les nibs et IB sont très pointilleux et que le débogueur ne donne pas beaucoup de détails ... si vous ne pouvez pas le faire fonctionner, vous pouvez commencer avec un nouveau fichier nib/xib.


Procédure pas à pas de mon code de travail

Ce problème m'a pris plusieurs jours à résoudre. Pour le bénéfice des autres, je vais donner une réponse détaillée et montrer tous mes codes et connexions pertinents.

Un engagement de travail où j'ai mis en œuvre l'action corrective (ci-dessus) est ici: https://github.com/jfosterdavis/ZMAppFoundation/commit/6855f0d5b9cd1bc320395e57e2b271653ef7acd1

Xcode version 9.2

Ma structure de fichier

Voici la structure de mon fichier (note: je crée un conteneur avec des cocoapodes nommé ZMAppFoundation. De plus, ZMPieTimerView.Swift n'est pas pertinent pour la solution.):

 enter image description here

Je souhaite que ma nib soit visible (IBDesignable) dans le fichier Main.storyboard. Voici le propriétaire du fichier et la classe personnalisée de mon xib, ZMGauge.xib:

 File's Owner  Custom Class

Code, implémentations

Voici ma classe ZMXibView:

//  Adapted from https://medium.com/zenchef-tech-and-product/how-to-visualize-reusable-xibs-in-storyboards-using-ibdesignable-c0488c7f525d

import UIKit

@IBDesignable
open class ZMXibView: UIView {


    var contentView:UIView?
    @IBInspectable var nibName:String?

    override open func awakeFromNib() {
        super.awakeFromNib()
        xibSetup()
    }

    func xibSetup() {
        guard let view = loadViewFromNib() else { return }
        view.frame = bounds
        view.autoresizingMask =
            [.flexibleWidth, .flexibleHeight]
        addSubview(view)
        contentView = view
    }

    func loadViewFromNib() -> UIView? {
        guard let nibName = nibName else { return nil }
        let bundle = Bundle(for: type(of: self))
        let nib = UINib(nibName: nibName, bundle: bundle)
        return nib.instantiate(
            withOwner: self,
            options: nil).first as? UIView
    }

    override open func prepareForInterfaceBuilder() {
        super.prepareForInterfaceBuilder()
        xibSetup()
        contentView?.prepareForInterfaceBuilder()
    }
}

Dans le storyboard, mon xib est désigné dans la classe personnalisée. J'utilise des cocoapodes pour développer une gousse. J'ai explicitement sélectionné le module. (Notez que dans ma classe XibView, je dois définir la propriété nibName.):

 Setting custom class on the xib

N'oubliez pas!

Ensuite, vous devrez peut-être nettoyer, fermer Xcode, reconstruire ou tout simplement attendre que l'IB le restitue. Je ne sais toujours pas quand Xcode tentera de rendre les graphiques IBDesignables, et je ne connais pas de moyen de forcer.

Succès

Sur la base de mon code et des actions que j'ai effectuées, ma plume est maintenant visible dans IBDesignable dans mon Main.storyboard.

 nib is viewable now

Dans le cas où vous l'avez manqué

Au cas où vous l'auriez manqué, ma solution est tout en haut de ce post. J'ai eu la mienne d'effacer l'erreur citée par l'OP en supprimant certains IBOutlets orphelins.

4
Jacob Davis

Xcode 9.3, CocoaPods 1.5.3 Cela peut être dû à une mise à jour récente de la version de CocoaPods. Voir Issue here .

J'ai eu cette erreur IB Designables: Failed to render and update auto layout status dans le storyboard, la classe STPPaymentCardTextField dans Stripe SDK liée aux Cocoapods.

La solution est de déclasser vos CocoaPods à 1.4.0.

Sudo gem list cocoapods

Sudo gem uninstall cocoapods

Sudo gem install cocoapods -v 1.4.0

pod update
4
Cons Bulaquena

Pour moi, le correctif consistait à demander à Interface Builder de redessiner l'objet. J'avais ceci à deux endroits et les deux n'ont été corrigés par aucun changement de code, mais les symptômes de l'erreur de l'agent et les vues vierges dans le storyboard ont finalement été corrigés.

Un problème a été corrigé en faisant glisser UIView vers un ordre différent sous la vue et en le reconstruisant. Une seconde dans une cellule TableView with Prototype a été corrigée en sélectionnant TableView, en modifiant le nombre de cellules Prototype en deux, en attendant une seconde, puis en le rétablissant en un. La TableView, qui était un blanc, a ensuite correctement dessiné tous les éléments et l'erreur de l'agent a disparu.

On a l'impression qu'il s'agit d'un bogue avec IB et d'autres recherches. Il existe de nombreuses solutions pour une erreur similaire. J'espère que ça aide quelqu'un.

2
FiveOhHO

(xCode 9.2, Swift 4) Ce qui suit ne vous aidera peut-être pas exactement à votre problème, mais aidera les autres à résoudre un problème très similaire. C'était mon erreur: 

erreur: IB Designables: échec du rendu et de la mise à jour du statut de présentation automatique pour CustomExampleView (XXXXX): l'agent est tombé en panne.

J'ai pu supprimer l'erreur en supprimant les fichiers CustomExampleView.xib et CustomExampleView.Swift. Pour répliquer, j'ai ensuite recréé les fichiers, suis allé dans le fichier .xib et ai défini la classe personnalisée de la vue de niveau supérieur sur CustomExampleView.

Mon erreur définissait la classe personnalisée sur la vue de niveau supérieur du fichier .xib au lieu de la définir sur le propriétaire du fichier. Après avoir défini la classe personnalisée appropriée, mon problème a été résolu.

2
olearyj234

C’est le problème de certaines versions de cabochons comme 1.5.0. Si vous utilisez celle-ci, le rendu a échoué.

Sudo gem uninstall cocoapods

Vous pouvez installer n'importe quelle version spécifique en mentionnant comme ceci 

Sudo gem install cocoapods -v 1.4.0

J'espère que cela fonctionnera pour vous.

1
Shaheryar Malik

Pour moi ce problème résolu par,

  1. Mise à jour des pods.
  2. Modification du paramètre de construction en "$ (hérité)" pour les bibliothèques Swift Option intégrée.
  3. Construire, nettoyer, construire.
  4. Projet de clôture.
  5. Quitter Xcode.
  6. Courir à nouveau.

hahaha vieux bidouille :) Merci!

1
Najam
    post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
        config.build_settings.delete('CODE_SIGNING_ALLOWED')
        config.build_settings.delete('CODE_SIGNING_REQUIRED')
    end
end

La saisie du code susmentionné dans le fichier podfile résout les problèmes. Ce code supprime simplement l'exigence de signature de code pour le framework installé via Cocoapods. Mais cela semble être aussi un bogue dans IBDesignable lors de l’utilisation de paris Xcode 10 4 Je ne reçois pas ce bogue en raison du nouveau système de construction intégré à Xcode 10.

1
Nikhil Pandey

Je ne connais pas grand chose à la cause de ceci, mais je l'ai déjà vu plusieurs fois et chaque fois que cela est résolu en redémarrant xcode Je pense que c'est là que tout le monde devrait commencer et si cela ne fonctionne pas, vous pouvez essayer les autres réponses suggérées.

0
Castro Zwelithini

Malheureusement, vous ne pouvez pas utiliser IBOutlets dans un IBDesignable. Mieux répondre pour vous ici:

Rendu en direct des sous-vues connectées IBOutlet via des propriétés IBInspectable

Peut-être avez-vous voulu que votre UserView étende UIButton plutôt qu'UIView?

0
Mars

Je me rends compte à quel point c'est stupide de dire que faire ce que je suis sur le point de vous dire fait une différence, mais vous pouvez essayer de supprimer le code de rupture de 

override func prepareForInterfaceBuilder() {

et ne l'utilisez que dans 

override func awakeFromNib() {

. Je crains encore plus lorsque je signale qu'il est possible que vos modifications reflètent le scénario comme souhaité. 

Vous pouvez identifier le code de rupture en commentant toutes les lignes et en utilisant un processus d'élimination pour identifier la ligne de rupture. 

0
ScottyBlades