ios - example - ibinspectable swift 4
@IB Error de designación: Designables de IB: no se pudo actualizar el estado del diseño automático: la herramienta táctil Cocoa Touch de Interface Builder se bloqueó (21)
Agréguelo al final de su Podfile y ejecute
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
Tengo una subclase muy simple de UITextView que agrega la funcionalidad "Marcador de posición" que puede encontrar nativa del objeto Campo de texto. Aquí está mi código para la subclase:
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
}
}
}
Después de cambiar la clase para el objeto
UITextView
en el Inspector de identidad a
PlaceholderTextView
, puedo establecer la propiedad
Placeholder
perfectamente en el Inspector de atributos.
El código funciona muy bien cuando se ejecuta la aplicación, pero no muestra el texto del marcador de posición en el generador de interfaces.
También recibo los siguientes errores sin bloqueo (supongo que es por eso que no se está procesando en tiempo de diseño):
error: Designables de IB: no se pudo actualizar el estado del diseño automático: la herramienta táctil Cocoa de Interface Builder se bloqueó
error: Designables de IB: no se pudo procesar la instancia de PlaceholderTextView: la representación de la vista tardó más de 200 ms. Su código de dibujo puede sufrir un rendimiento lento.
No puedo entender qué está causando estos errores. El segundo error no tiene ningún sentido, ya que ni siquiera estoy anulando drawRect (). ¿Algunas ideas?
Agregue este script al final de mi
Podfile
y realice la
pod install
nuevamente.
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
Asegúrese de que no está inicializando directamente
UIImage
o
UIFont
utilizando activos o fuentes añadidas en su proyecto.
Siempre creo una
private func setUp()
en mis clases de
UI
personalizadas
@IBDesignable
.
que se llama desde
init(frame: CGRect)
,
init?(coder aDecoder: NSCoder)
.
Así que finalmente actualicé la
setup()
la siguiente manera.
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
}
Creo que la razón es que su xib no tiene el mismo tamaño que el diseño en el guión gráfico. Asegúrese de que el xib tenga la misma altura y anchura.
Cuando depuré esto descubrí que hay algunas clases que están modificando la interfaz de usuario. Por lo general, marquelabel, que es una subclase de UILabel o cualquier otra subclase de clase UIView y dibuja ui en tiempo de ejecución y colisiona con el motor Autolayout. Intente dar ancho o alto fijo para estas vistas personalizadas. Si no resuelve su problema, intente las siguientes soluciones:
Solución 1: - Descomente #use_frameworks dentro de su archivo pod.
Solución 2: intente eliminar los datos derivados. 1. Cierre la ventana del editor de su Xcode y salga del simulador -> 2. Vaya a Preferencias de Xcode -> Ubicaciones -> 3. Haga clic en la pequeña flecha gris que muestra la ruta de datos derivados -> 4. Seleccione su proyecto -> 5. Elimine todas las carpetas dentro -> 6. Salga de Xcode y vuelva a abrir
En mi caso, de alguna manera estaba relacionado con un marco de cartago que estaba usando. Tuve que agregar $ (PROJECT_DIR) / Carthage / Build / iOS a la configuración de compilación Runpath Search Paths
En mi caso, estaba haciendo lo siguiente en los métodos initWithFrame / initWithCoder para crear la vista:
className = NSStringFromClass([self class]);
self.view = [[[NSBundle mainBundle] loadNibNamed:className owner:self options:nil] firstObject];
Parece que no debía usar el paquete principal , sino el paquete de la clase. Así que reemplacé ese código por lo siguiente y funcionó:
bundle = [NSBundle bundleForClass:[self class]];
className = NSStringFromClass([self class]);
self.view = [[bundle loadNibNamed:className owner:self options:nil] firstObject];
Pensé que tal vez esto podría ayudar a alguien.
En mi caso, fue un problema con OneSignal. Aparentemente, tienen un error dentro de la versión 2.2.0 y superior. ¡Cambió a 2.1.6 y todo vuelve a estar bien!
Mira this .
En realidad, si tiene algunos atributos definidos por el usuario antiguos (que no son válidos para la vista actual) en cualquier vista de su guión gráfico, eso puede hacer que su agente se bloquee.
Además, a veces sucede solo por un error desagradable de Xcode. Para verificarlo, cuando esté en el guión gráfico desmarque Editor> Actualizar automáticamente las vistas, luego muévase a otro archivo, limpie y reinicie su proyecto. Después de ingresar nuevamente al guión gráfico, puede hacer clic en Editor> Actualizar vistas y verificar una vez más automáticamente. Ese también resolvió mi problema una vez.
Si ambos no funcionaron, entonces probablemente haya hecho algo incorrecto en su vista de IBDesignable, así que elija sus vistas bloqueadas en el guión gráfico y depure haciendo clic en Editor> Vistas de depuración
Es como si obtuviera Código de otro Desarrollador y obtiene este error. Solo corre
pod install
Esto funcionó para mí. Espero eso ayude.
Estaba experimentando los problemas similares de Interface Builder al representar los designables.
Utilizando la técnica sugerida en esta answer pude rastrear el problema hasta el uso de literales de imagen.
Renderizado
self.backgroundImage.image = #imageLiteral(resourceName: "rectangleCenter")
Sin bloqueo de renderizado
self.backgroundImage.image = UIImage(named: "rectangleCenter")
Este no es el caso para esta pregunta, pero tal vez pueda ayudar a alguien más.
Tuve un problema similar cuando en mi clase @IBDesignable no implementé ambos:
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
// custom setup
}
override init(frame: CGRect) {
super.init(frame: frame)
// custom setup
}
He tenido el mismo problema un par de veces. Ambas veces comenzó cuando estaba cargando una plumilla IBDesignable en el guión gráfico cuando la plumilla no cabía en la vista (es decir, tenía un botón fuera de la UIView pero todavía en la plumilla). Una vez que arreglé que Xcode todavía me daba errores, reinicié Xcode hasta que dejó de darme el error al azar.
Espero que esto ayude.
ACTUALIZACIÓN: Acabo de eliminar todos los procesos llamados "Interface Builder Cocoa Touch Tool", reinicié Xcode y el error desapareció. No sé si esto siempre funcionará o no.
Para Xcode 8 - Swift
Agregar valor opcional como valor predeterminado en
@IBInspectable
causa un problema.
Esto no funcionará:
@IBInspectable var repeatImage: UIImage = UIImage(named:"myImage")!{
didSet {
// configureView
}
}
Esto debería funcionar:
@IBInspectable var repeatImage: UIImage = RepeatImageView.getDefaultImage() {
didSet {
// configureView()
}
}
class func getDefaultImage() -> UIImage {
if let defaultImage = UIImage(named: "myImage") {
return defaultImage
} else {
return UIImage()
}
}
Para mí era un certificado de firma faltante, porque nunca ejecuté la aplicación, por lo que Xcode aún no creó un certificado.
Una vez que ejecuté la aplicación, la representación de
IBDesignable
funcionó bien.
Puede seleccionar su vista personalizada en Interface Builder y luego usar
Editor
,
Debug Selected Views
.
IBDesignableAgentCocoaTouch
llamada sesión de depuración
IBDesignableAgentCocoaTouch
cuando todos los puntos de interrupción (incluidos los puntos de interrupción de excepción) funcionen y usted pueda identificar exactamente el lugar donde se bloquea su vista.
Se generan informes de fallas cuando se bloquea la herramienta de interfaz de usuario Cocoa Touch.
Las tesis se encuentran en
~/Library/Logs/DiagnosticReports
y se denominan
IBDesignablesAgentCocoaTouch_*.crash
.
En mi caso, contenían un útil seguimiento de pila que identificaba el problema en mi código.
Simplemente deje que se compile y ejecute en el simulador si tiene un error en algún otro lugar del proyecto, simplemente coméntelo y ejecute primero lo que se designe para actualizarlo y descomentar los otros códigos. Esto funciona para mi.
Solo me faltaba esta línea de
platform :ios, ''7.0''
de código
platform :ios, ''7.0''
y el problema se resolvió.
Solo esta línea en su archivo pod y la actualización de su problema pod se resolverá.
Tuve el mismo problema y lo resolví agregando ''use_frameworks!'' al Podfile de mi proyecto.
Espero que te ayude.
Un problema importante es cuando crea @ IBDesignable, asegúrese de que el archivo cocoapod no esté incluido en los UITests o de lo contrario causará este bloqueo.