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
UserView
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
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
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).
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
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.
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.
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
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.):
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
:
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
.):
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.
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.
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.
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
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.
(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.
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.
Pour moi ce problème résolu par,
hahaha vieux bidouille :) Merci!
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.
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.
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?
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.