web-dev-qa-db-fra.com

Erreur @IBDesignable: IB Designables: Échec de la mise à jour du statut de la présentation automatique: Interaction de Cocoa Touch Tool d'Interface Builder

J'ai une sous-classe très simple de UITextView qui ajoute la fonctionnalité "Placeholder" que vous pouvez trouver natif à l'objet Text Field. Voici mon code pour la sous-classe:

import UIKit
import Foundation

@IBDesignable class PlaceholderTextView: UITextView, UITextViewDelegate
{
    @IBInspectable var placeholder: String = "" {
        didSet {
            setPlaceholderText()
        }
    }
    private let placeholderColor: UIColor = UIColor.lightGrayColor()        
    private var textColorCache: UIColor!

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.delegate = self
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.delegate = self
    }

    func textViewDidBeginEditing(textView: UITextView) {
        if textView.text == placeholder {
            textView.text = ""
            textView.textColor = textColorCache
        }
    }

    func textViewDidEndEditing(textView: UITextView) {
        if textView.text == "" && placeholder != "" {
            setPlaceholderText()
        }
    }

    func setPlaceholderText() {
        if placeholder != "" {
            if textColorCache == nil { textColorCache = self.textColor }
            self.textColor = placeholderColor
            self.text = placeholder
        }
    }
}

Après avoir défini la variable UITextView dans la classe de l'objet PlaceholderTextView de l'inspecteur d'identité, je peux définir la propriété Placeholder dans l'instruction Inspector. Le code fonctionne très bien lors de l'exécution de l'application, mais n'affiche pas le texte d'espace réservé dans le générateur d'interface. J'obtiens également les erreurs non bloquantes suivantes (je suppose que c'est pourquoi le rendu n'est pas au moment de la conception):

erreur: IB Designables: échec de la mise à jour du statut de présentation automatique: Interaction de Cocoa Touch Tool d'Interface Builder

error: IB Designables: Echec du rendu de l'instance de PlaceholderTextView: Le rendu de la vue a duré plus de 200 ms. Votre code de dessin peut être ralenti.

Je ne suis pas capable de comprendre ce qui cause ces erreurs. La deuxième erreur n’a aucun sens, car je n’écarte même pas drawRect (). Des idées?

149
Albert Bori

Des rapports d'incident sont générés en cas de blocage d'Interface Builder Cocoa Touch Tool. Ces thèses sont situées dans ~/Library/Logs/DiagnosticReports et nommées IBDesignablesAgentCocoaTouch_*.crash. Dans mon cas, ils contenaient une trace de pile utile qui identifiait le problème dans mon code.

225
Petter

J'ai eu le même problème à plusieurs reprises. Les deux fois, cela a commencé lorsque je chargeais une pointe IBDesignable sur le storyboard lorsque la pointe ne pouvait pas tenir sur la vue (c’est-à-dire que j’avais un bouton dans UIView mais toujours dans la pointe). Une fois que j'ai corrigé, xCode m'avait toujours donné des erreurs, j'ai donc redémarré Xcode jusqu'à ce qu'il se ferme de manière aléatoire, ce qui m'a donné l'erreur. 

J'espère que ça aide.

MISE À JOUR: Je viens de tuer tous les processus nommés "Interface Builder Cocoa Touch Tool", j'ai redémarré Xcode et l'erreur est partie. Je ne sais pas si cela fonctionnera toujours ou non.

50
Dustin Williams

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];

On dirait que j'étais Not censé utiliser le paquet principal, mais plutôt 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.

38
jmoukel

Vous pouvez sélectionner votre vue personnalisée dans Interface Builder, puis utiliser Editor, Debug Selected Views. Il lancera la session de débogage IBDesignableAgentCocoaTouch lorsque tous les points d'arrêt (y compris les points d'arrêt d'exception) fonctionnent et que vous pouvez identifier exactement l'endroit où votre vue se bloque.

14
Fyodor Volchyok

Pour XCode8 - Swift  

Ajout de la valeur optionnelle comme valeur par défaut sur @IBInspectable qui me pose problème.

Cela ne fonctionnera pas:

@IBInspectable var repeatImage:UIImage = UIImage(named:"myImage")!{
      didSet{
       // configureView
      }
}

Cela devrait fonctionner:

@IBInspectable var repeatImage:UIImage = RepeatImageView.getDefaultImage(){
        didSet{
           // configureView()
        }
}

class func getDefaultImage()->UIImage{
        if let defaultImage = UIImage(named: "myImage"){
            return defaultImage
        }else{
            return UIImage()
        }
}
11
Zaid Pathan

Je rencontrais des problèmes similaires avec Interface Builder lors du rendu des objets de conception.

En utilisant la technique suggérée dans ce answer , j’ai pu cerner le problème de l’utilisation des littéraux d’image.

Crash de rendu

self.backgroundImage.image =  #imageLiteral(resourceName: "rectangleCenter")

Aucun crash de rendu

self.backgroundImage.image =  UIImage(named: "rectangleCenter")
9
Nick Cross

En fait, si vous avez des old attributs définis par l'utilisateur (qui ne sont pas valides pour la vue actuelle) dans une vue de votre storyboard, votre agent risque de tomber en panne. 

En outre, cela se produit parfois simplement à cause d'un bogue méchant de Xcode. Pour le vérifier, lorsque vous êtes dans le storyboard, décochez Edit> Actualiser automatiquement les vues, puis déplacez vers un autre fichier, nettoyez et redémarrez votre projet. Une fois que vous avez réintégré le storyboard, vous pouvez cliquer sur Editeur> Actualiser les vues et en vérifier l’automatique. Celui-ci a également résolu mon problème une fois.

Si les deux ne fonctionnent pas, vous avez probablement mal agi sur votre vue IBDesignable. Choisissez donc les vues bloquées dans le storyboard et procédez au débogage en cliquant sur Editeur> Vues de débogage.

6
Yusuf Kamil AK

Ce n'est pas le cas pour cette question, mais peut-être que je vais aider quelqu'un d'autre. 

J'ai eu un problème similaire lorsque, dans ma classe @IBDesignable, je n'ai pas implémenté les deux:

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

    // custom setup
}

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

    // custom setup
}
4
tzaloga

Dans mon cas, c'était un problème avec OneSignal. Apparemment, ils ont un bogue dans la version 2.2.0 et supérieure. Passé à 2.1.6 et tout est encore génial!

Découvrez this .

3
Paul Berg

J'ai eu le même problème, mais je l'ai résolu en ajoutant le 'use_frameworks!' PodFile de votre projet.hope, il pourrait vous aider.

3
Jimmy Ng

Dans mon cas, il était en quelque sorte lié à un framework carthage que j'utilisais. J'ai dû ajouter $ (PROJECT_DIR)/Carthage/Build/iOS au paramètre de construction Runpath Search Paths

3
AkademiksQc

Quand j'ai débogué ceci j'ai découvert qu'il y a quelques classes qui modifient l'interface utilisateur. Généralement, marquelabel est une sous-classe d'UILabel ou de toute autre classe qui sous-classe UIView et dessine ui au moment de l'exécution et se heurte au moteur Autolayout. Essayez de donner une largeur ou une hauteur fixe pour ces vues personnalisées. Si cela ne résout pas votre problème, essayez les solutions suivantes: -

Solution 1: - Supprimez les commentaires de #use_frameworks dans votre fichier pod.

Solution 2: - Essayez de supprimer les données dérivées. 1. Fermez la fenêtre de l'éditeur de votre Xcode et quittez Simulator -> 2. Allez dans Préférences Xcode -> Emplacements -> 3. Cliquez sur la petite flèche grise affichant le chemin de données dérivé -> 4. Sélectionnez votre projet -> 5. Supprimez tous les dossiers qu'il contient -> 6. Quittez Xcode et rouvrez

1
Ashish Pisey

Ajoutez ce script à la fin de ma Podfile et exécutez à nouveau pod install.

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
1
Haroldo Gondim

Ajoutez-le au bas de votre fichier podfile et exécutez pod install

# Workaround for Cocoapods issue #7606

    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
1
Tissa

Un problème majeur concerne la création de @ IBDesignable, assurez-vous que le fichier cocoapod n’est pas inclus dans les UITest, sinon il provoquera ce blocage.

1
Modesto Cabrera

C'est comme si vous obteniez du code d'un autre développeur et que vous obteniez cette erreur . 

pod install

Cela a fonctionné pour moi ... Espoir que cela aide.

0
Dhruv Khatri

Pour moi, il s'agissait d'un certificat de signature manquant, car je n'avais jamais exécuté l'application, Xcode n'a donc pas encore créé de certificat. Une fois l'application lancée, le rendu IBDesignable fonctionnait correctement.

0
florianpfisterer

Je trouve que la raison est que votre xib n’a pas la même taille que le design du scénarimage. Assurez-vous que le xib a la même hauteur et la même largeur. 

0
user6476366

Il me manquait juste cette ligne de code platform :ios, '7.0' et le problème a été résolu. Seule cette ligne dans votre fichier de pod et mettre à jour votre problème de pod sera résolue.

0
Shahzaib Maqbool

Assurez-vous de ne pas initialiser directementUIImageouUIFonten utilisant des ressources ou des polices ajoutées à votre projet.

Je crée toujours une private func setUp() dans mes classes UI personnalisées @IBDesignable . Qui est appelée à partir de init(frame: CGRect), init?(coder aDecoder: NSCoder). J'ai donc finalement mis à jour le setup() comme suit.

private func setUp() {

     //... Doing initial configurations

     // iconImageView.image = UIImage(named: "IconImageName")! // Causing the Crash, use if let OR guard let instead
     if let icon = UIImage(named: "IconImageName") {
          iconImageView.image = icon
          iconImageView.frame.size = icon.size
     }

     // nameLabel.font =  UIFont(name: "Calibri-Light", size: 15.0) // Causing the Crash, use if let OR guard let instead
     if let font = UIFont(name: "Calibri-Light", size: size) {
          nameLabel.font =  font
     } else {
          nameLabel.font = UIFont.systemFont(ofSize: size) 
     }

     // Doing other stuffs
}
0
Sauvik Dolui