@IBDesignable crashende agent

Als ik mijn eigen UIButton-extended klasse schrijf en deze @IBDesignablemaak, krijg ik twee fouten in Interface Builder, namelijk:

  • Main.storyboard: fout: IB Designables: kan de status van de automatische lay-out niet bijwerken: de agent is gecrasht omdat de fd is gesloten
  • Main.storyboard: error: IB Designables: kan instantie van RandjeUIButton niet weergeven: de agent is gecrasht

Hier is mijn code:

import UIKit
@IBDesignable
class RandjeUIButton: UIButton {
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.backgroundColor = UIColor.blackColor()
    }
}

Ik werk in Xcode 7 beta 2 op OS X 10.11 beta 2. (draait in VM)


Antwoord 1, autoriteit 100%

Xcode’s Interface Builder vereist dat u beideof geen van beideinitializers implementeert voor @IBDesignableklassen om correct te worden weergegeven in IB.

Als u required init(coder aDecoder: NSCoder)implementeert, moet u ook init(frame: CGRect)overschrijven, anders “loopt de agent vast” zoals te zien is in de fouten die door Xcode worden gegenereerd.

Voeg hiervoor de volgende code toe aan je klas:

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

Antwoord 2, autoriteit 20%

Ik ben hetzelfde probleem tegengekomen en heb het op deze manier opgelost:

  1. Het probleem:

fout: IB Designables: kan de status van de automatische lay-out niet bijwerken: de agent is gecrasht

  1. Zoek de foutopsporingsknop in het inspectiebestand en klik erop.

debug

  1. Dan zal de Xcode je vertellen waar het probleem zich bevindt.
    In mijn geval laat ik de IBDesignablevoor de les vallen.

  2. Vervolgens maak ik het schoon en herbouw het, de fout is verdwenen


Antwoord 3, autoriteit 10%

Er zijn talloze problemen die dit kunnen veroorzaken. Start de console en zoek naar het crashrapport IBDesignablesCocoaTouch...

Ik heb zojuist een probleem opgelost met een ontwerpbare derde partij die problemen had met de valueForKey-semantiek.


Antwoord 4, autoriteit 9%

In Xcode 7.3 werkte geen van de bovenstaande oplossingen voor mij, maar het geaccepteerde antwoord op deze vraag wel: Kan instantie van IB Designables niet weergeven

  1. Wis van Xcode afgeleide gegevens voor het project. Ze staan ​​in ~/Bibliotheek/Developer/Xcode/DerivedData
  2. Reinig je huidige build door op ⌘⇧K te drukken
  3. Bouw je project op
  4. Ga in storyboard naar het Editor-menu en doe Refresh All Views; wacht tot de build is voltooid en de fouten moeten zijn verdwenen

Ik hoefde de 4e stap niet te doen om het probleem op te lossen (en mijn PaintCode-drawRect’d UIView te krijgen om in het storyboard te schilderen), hier opgenomen voor het geval dat.

Met dank aan @Mojtaba en @WeZZard


Antwoord 5, autoriteit 9%

Voor mij was het niet het gebruik van #if !TARGET_INTERFACE_BUILDERdie me te pakken kreeg. Eigenlijk had ik een code die zou resulteren in toegang tot een pad in mijn bundel…

Bundle.main.path(forResource: "Foo", ofType: "plist")

Het probleem is dat wanneer u in IB (en niet in uw app) draait, Bundle.mainniet uw app is…

(lldb) po Bundle.main
NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)

Dus het antwoord hierop is eenvoudigweg uw @IBDesignable UIView-code zorgvuldig te bekijken en #if !TARGET_INTERFACE_BUILDERvoor alles te gebruiken (in mijn geval roept u CoreLocationbijvoorbeeld) dat heeft geen zin als het tijdens het ontwerpen wordt uitgevoerd.

Hoe ik foutopsporing heb gedaan en dit heb gevonden

Dit is wat je ziet als je de Editor -> Debug Selected Viewterwijl u uw @IBDesignable UIViewin uw storyboard selecteert:

Dit is wat je ziet als je de <code>Editor ->Debug Selected View</code>gebruikt terwijl je je <code>@IBDesignable UIView</code>in je storyboard selecteert”></a></p>
<h3>Je crasht dan op de juiste locatie</h3>
<p><a href=De foutopsporingsnavigator

In mijn geval, zoals je kunt zien, deed initXXXXeen assert, die crashte tijdens het ontwerpen, omdat het op zoek was naar een waarde in het bestand in mijn bundel&nbsp ;— wat Xcode is, tijdens het ontwerpen.


Antwoord 6, autoriteit 7%

Ik heb iets heel belangrijks gevonden bij het gebruik van een UIImage in een klasse gemarkeerd met @IBDesignable.
De klassieke UIImage init zou de agent laten crashen:

let myImage = UIImage(named: String) // crash the agent

De oplossing is om deze init-methode van UIImage te gebruiken:

let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)

Voorbeeld van werkende code:

let appBundle = Bundle(for: type(of: self))
let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))

Waar zelf je klas is met het trefwoord @IBDesignable.
Xcode 9.4, Swift 4.1


Antwoord 7, autoriteit 7%

XCode 10, Swift 4.2

Ik heb een antwoord gevonden hier

De oplossing was eenvoudig – de manier wijzigen waarop de bundel werd opgelost in de required init?(coder aDecoder: NSCoder)methode van mijn aangepaste weergaveklasse.

   Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)

moet worden gewijzigd in

let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)

8, Autoriteit 2%

Open gewoon een code op een ander Xcode Setup-systeem. In mijn geval werkte het.


9

Ik verspilde hier een volledige dag en eindelijk heb ik mijn probleem opgelost  Voer beeld beschrijving hier in

Ik heb gebouwd gebouwd voor het doel als 8.0 en het repareert alles voor mij.

Other episodes