Als ik mijn eigen UIButton
-extended klasse schrijf en deze @IBDesignable
maak, 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 @IBDesignable
klassen 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:
- Het probleem:
fout: IB Designables: kan de status van de automatische lay-out niet bijwerken: de agent is gecrasht
- Zoek de foutopsporingsknop in het inspectiebestand en klik erop.
-
Dan zal de Xcode je vertellen waar het probleem zich bevindt.
In mijn geval laat ik deIBDesignable
voor de les vallen. -
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
- Wis van Xcode afgeleide gegevens voor het project. Ze staan in ~/Bibliotheek/Developer/Xcode/DerivedData
- Reinig je huidige build door op ⌘⇧K te drukken
- Bouw je project op
- 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_BUILDER
die 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.main
niet 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_BUILDER
voor alles te gebruiken (in mijn geval roept u CoreLocation
bijvoorbeeld) 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 View
terwijl u uw @IBDesignable UIView
in uw storyboard selecteert:
In mijn geval, zoals je kunt zien, deed initXXXX
een assert
, die crashte tijdens het ontwerpen, omdat het op zoek was naar een waarde in het bestand in mijn bundel  ;— 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
Ik heb gebouwd gebouwd voor het doel als 8.0 en het repareert alles voor mij.