Ich habe eine sehr einfache Unterklasse von UITextView, die die "Platzhalter" -Funktionalität hinzufügt, die Sie im Textfeldobjekt nativ finden können. Hier ist mein Code für die Unterklasse:
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
}
}
}
Nachdem ich die Klasse für das UITextView
Objekt im Identitätsinspektor in geändert habe PlaceholderTextView
, kann ich die Placeholder
Eigenschaft im Attributinspektor einwandfrei festlegen . Der Code funktioniert hervorragend, wenn die App ausgeführt wird, zeigt jedoch den Platzhaltertext nicht im Interface Builder an. Ich erhalte auch die folgenden nicht blockierenden Fehler (ich gehe davon aus, dass dies der Grund ist, warum es zur Entwurfszeit nicht gerendert wird):
Fehler: IB Designables: Fehler beim Aktualisieren des automatischen Layoutstatus: Interface Builder Cocoa Touch Tool ist abgestürzt
Fehler: IB Designables: Fehler beim Rendern der Instanz von PlaceholderTextView: Das Rendern der Ansicht dauerte länger als 200 ms. Ihr Zeichnungscode kann unter einer langsamen Leistung leiden.
Ich kann nicht herausfinden, was diese Fehler verursacht. Der zweite Fehler macht keinen Sinn, da ich drawRect () nicht einmal überschreibe. Irgendwelche Ideen?
quelle
Antworten:
Beim Absturz des Interface Builder Cocoa Touch Tool werden Absturzberichte generiert. Die Arbeiten befinden sich in
~/Library/Logs/DiagnosticReports
und benanntIBDesignablesAgentCocoaTouch_*.crash
. In meinem Fall enthielten sie eine nützliche Stapelverfolgung, die das Problem in meinem Code identifizierte.quelle
initFrame(frame: CGRect)
dies definiert werden muss. Tun Sie dies, wenn Sie Ihre eigeneninit
Methoden angeben.init(frame: CGRect)
explizit überschreiben, da ich eine benutzerdefinierteini
Methode hatte. Möglicherweise möchten Sie den Absturzberichtuse of unimplemented initializer 'init(frame:)'
direkt unterApplication Specific Information
im Bericht durchsuchen. Danke Leute! Doppelter Gewinn in dieser Antwort!Ich hatte das gleiche Problem ein paar Mal. Beide Male begann es, als ich eine IBDesignable-Feder in das Storyboard lud, als die Feder nicht in die Ansicht passen konnte (dh ich hatte eine Schaltfläche in der UIView, aber immer noch in der Feder). Nachdem ich behoben hatte, dass Xcode immer noch Fehler verursachte, startete ich Xcode neu, bis es zufällig aufhörte, mir den Fehler zu geben.
Ich hoffe das hilft.
UPDATE: Ich habe gerade alle Prozesse mit dem Namen "Interface Builder Cocoa Touch Tool" beendet, Xcode neu gestartet und der Fehler ist verschwunden. Ich weiß nicht, ob das immer funktioniert oder nicht.
quelle
init
Methoden überschreiben , zeigt der als Teil der Frage veröffentlichte Code dieIB Designables
Fehler nicht mehr an und der Platzhalter wird im Interface Builder ordnungsgemäß gerendert.In meinem Fall habe ich die nächste Methode in den Methoden initWithFrame / initWithCoder ausgeführt, um die Ansicht zu erstellen:
Es sieht so aus, als hätte ich nicht das Hauptpaket verwenden sollen , sondern das Paket der Klasse. Also habe ich diesen Code durch den folgenden ersetzt und es hat funktioniert:
Ich dachte, vielleicht könnte das jemandem helfen.
quelle
let bundle = Bundle(for: ValidatingTextField.self)
in SwiftSie könnten Ihre benutzerdefinierte Ansicht im Interface Builder und dann Verwendung wählen
Editor
,Debug Selected Views
. Es wird eine sogenannteIBDesignableAgentCocoaTouch
Debug-Sitzung gestartet, wenn alle Haltepunkte (einschließlich Ausnahme-Haltepunkte) funktionieren und Sie den Ort, an dem Ihre Ansicht abstürzt, genau identifizieren können.quelle
Für Xcode 8 - Swift
Hinzufügen eines optionalen Werts als Standardwert, um
@IBInspectable
ein Problem für mich zu verursachen.Das wird nicht funktionieren:
Das sollte funktionieren:
quelle
Ich hatte ähnliche Probleme mit dem Interface Builder beim Rendern von Designables.
Mit der in dieser Antwort vorgeschlagenen Technik konnte ich das Problem auf die Verwendung von Bildliteralen zurückführen.
Absturz beim Rendern
Kein Rendering-Absturz
quelle
Wenn Sie in einer Ansicht Ihres Storyboards einige alte benutzerdefinierte Attribute haben (die für die aktuelle Ansicht nicht gültig sind), kann dies zum Absturz Ihres Agenten führen.
Außerdem passiert es manchmal nur wegen eines bösen Fehlers von Xcode. Wenn Sie sich im Storyboard befinden, deaktivieren Sie das Kontrollkästchen Editor> Ansichten automatisch aktualisieren, verschieben Sie es in eine andere Datei, bereinigen Sie Ihr Projekt und starten Sie es neu. Nachdem Sie das Storyboard erneut aufgerufen haben, können Sie auf Editor> Ansichten aktualisieren klicken und die automatische erneut aktivieren. Dieser hat auch mein Problem einmal gelöst.
Wenn beides nicht funktioniert hat, haben Sie wahrscheinlich etwas an Ihrer IBDesignable-Ansicht falsch gemacht. Wählen Sie also Ihre abgestürzten Ansichten im Storyboard aus und debuggen Sie, indem Sie auf Editor> Debug-Ansichten klicken
quelle
Dies ist bei dieser Frage nicht der Fall, aber vielleicht helfe ich jemand anderem.
Ich hatte ein ähnliches Problem, als ich in meiner @IBDesignable-Klasse nicht beide implementiert habe:
quelle
Ich hatte das gleiche Problem und löste es durch Hinzufügen der 'use_frameworks!' zum Podfile meines Projekts.
Hoffe es hilft dir.
quelle
In meinem Fall hing es irgendwie mit einem Karthago-Framework zusammen, das ich verwendete. Ich musste $ (PROJECT_DIR) / Carthage / Build / iOS zur Build-Einstellung Runpath Search Paths hinzufügen
quelle
In meinem Fall war es ein Problem mit OneSignal. Anscheinend haben sie einen Fehler in der Version 2.2.0 und höher. Auf 2.1.6 umgestellt und alles ist wieder großartig!
Überprüfen Sie dies .
quelle
Als ich dies debuggte, fand ich heraus, dass es einige Klassen gibt, die die Benutzeroberfläche modifizieren. In der Regel marquelabel, eine Unterklasse von UILabel oder einer anderen Klasse, die UIView unterordnet und zur Laufzeit ui zeichnet und mit der Autolayout-Engine kollidiert. Geben Sie für diese benutzerdefinierten Ansichten eine feste Breite oder Höhe an. Wenn es Ihr Problem nicht löst, versuchen Sie folgende Lösungen: -
Lösung 1: - Kommentieren Sie #use_frameworks in Ihrer Pod-Datei aus.
Lösung 2: - Versuchen Sie, abgeleitete Daten zu löschen. 1. Schließen Sie das Editorfenster Ihres Xcodes und beenden Sie den Simulator -> 2. Gehen Sie zu Xcode-Einstellungen -> Speicherorte -> 3. Klicken Sie auf einen kleinen grauen Pfeil mit dem abgeleiteten Datenpfad -> 4. Wählen Sie Ihr Projekt aus -> 5. Löschen Sie alle darin enthaltenen Ordner -> 6. Beenden Sie Xcode und öffnen Sie es erneut
quelle
Fügen Sie es am Ende Ihres Podfiles hinzu und führen Sie es aus
pod install
quelle
Fügen Sie dieses Skript am Ende von my hinzu
Podfile
und führen Sie espod install
erneut aus.quelle
Ein Hauptproblem besteht darin, dass Sie beim Erstellen von @ IBDesignable sicherstellen, dass die Cocoapod- Datei nicht in den UITests enthalten ist. Andernfalls wird dieser Absturz verursacht.
quelle
Ich finde den Grund dafür, dass Ihr xib nicht die gleiche Größe hat wie das Design im Storyboard. Stellen Sie sicher, dass die xib die gleiche Höhe und Breite hat.
quelle
Mir fehlte nur diese Codezeile
platform :ios, '7.0'
und das Problem wurde gelöst. Nur diese Zeile in Ihrer Pod-Datei und die Aktualisierung Ihres Pod-Problems werden behoben.quelle
Für mich war es ein fehlendes Signaturzertifikat, da ich die App nie ausgeführt habe und Xcode noch kein Zertifikat erstellt hat. Nachdem ich die App ausgeführt hatte,
IBDesignable
funktionierte das Rendern einwandfrei.quelle
Es ist so, als hätten Sie Code von einem anderen Entwickler erhalten und diesen Fehler erhalten. Renn einfach
Das hat bei mir funktioniert. Ich hoffe es hilft.
quelle
Stellen Sie sicher, dass Sie Assets oder Schriftarten, die in Ihrem Projekt hinzugefügt wurden, nicht direkt initialisieren
UIImage
oderUIFont
verwenden.Ich erstelle immer eine
private func setUp()
in meinen@IBDesignable
benutzerdefiniertenUI
Klassen. welches heißt voninit(frame: CGRect)
,init?(coder aDecoder: NSCoder)
. Also habe ich endlichsetup()
folgendes wie folgt aktualisiert .quelle
Lassen Sie es einfach auf dem Simulator erstellen und ausführen, wenn Sie irgendwo anders im Projekt einen Fehler haben. Kommentieren Sie es einfach aus und führen Sie zuerst designable aus, um designable zu aktualisieren und die anderen Codes zu kommentieren. Für mich geht das.
quelle