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 UITextView
objeto en el Inspector de identidad a PlaceholderTextView
, puedo establecer la Placeholder
propiedad muy bien 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 del creador de interfaces de Cocoa 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?
fuente
Respuestas:
Se generan informes de fallas cuando se bloquea la herramienta táctil Interface Builder Cocoa. Las tesis están ubicadas
~/Library/Logs/DiagnosticReports
y nombradasIBDesignablesAgentCocoaTouch_*.crash
. En mi caso, contenían un útil seguimiento de pila que identificaba el problema en mi código.fuente
initFrame(frame: CGRect)
debe definirse. Hágalo si proporciona sus propiosinit
métodos.init(frame: CGRect)
explícitamente porque tenía unini
método personalizado . Es posible que desee consultar el informe de bloqueouse of unimplemented initializer 'init(frame:)'
directamente debajoApplication Specific Information
del informe. ¡Gracias chicos! ¡Doble victoria en esta respuesta!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 matar todos los procesos llamados "Interface Builder Cocoa Touch Tool", reinicié Xcode y el error desapareció. No sé si esto siempre funcionará o no.
fuente
init
métodos, el código publicado como parte de la pregunta ya no muestra losIB Designables
errores y el marcador de posición se representa correctamente en el Creador de interfaces.En mi caso, estaba haciendo lo siguiente en los métodos initWithFrame / initWithCoder para crear la vista:
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ó:
Pensé que tal vez esto podría ayudar a alguien.
fuente
let bundle = Bundle(for: ValidatingTextField.self)
en SwiftUsted puede seleccionar la vista personalizada en el Interface Builder y el uso a continuación
Editor
,Debug Selected Views
.IBDesignableAgentCocoaTouch
Lanzará la llamada sesión de depuración 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.fuente
Para Xcode 8 - Swift
Agregar valor opcional como valor predeterminado al
@IBInspectable
causarme un problema.Esto no funcionará:
Esto debería funcionar:
fuente
Estaba experimentando los problemas similares de Interface Builder al representar los designables.
Utilizando la técnica sugerida en esta respuesta pude rastrear el problema hasta el uso de literales de imagen.
Renderizado
Sin bloqueo de renderizado
fuente
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 automáticamente uno nuevamente. Ese también resolvió mi problema una vez.
Si ambos no funcionaron, entonces probablemente haya hecho algo mal con respecto a su vista IBDesignable, así que elija sus vistas bloqueadas en el guión gráfico y depúrelas haciendo clic en Editor> Vistas de depuración
fuente
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:
fuente
Tuve el mismo problema y lo resolví agregando 'use_frameworks!' al Podfile de mi proyecto.
Espero que te ayude.
fuente
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
fuente
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 esto .
fuente
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 clase que subclasifique UIView y dibuje ui en tiempo de ejecución y colisione 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
fuente
Añádelo al final de tu Podfile y ejecuta
pod install
fuente
Agregue este script al final de mi
Podfile
y realicepod install
nuevamente.fuente
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.
fuente
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.
fuente
Solo me faltaba esta línea de código
platform :ios, '7.0'
y el problema se resolvió. Solo esta línea en su archivo pod y actualizará su problema pod se resolverá.fuente
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, el
IBDesignable
renderizado funcionó bien.fuente
Es como si obtuviera Código de otro Desarrollador y obtiene este error. Solo corre
Esto funcionó para mí. Espero eso ayude.
fuente
Asegúrese de que no está inicializando directamente
UIImage
oUIFont
utilizando activos o fuentes agregadas en su proyecto.Siempre creo un
private func setUp()
en mis clases@IBDesignable
personalizadasUI
. que se llama a partir deinit(frame: CGRect)
,init?(coder aDecoder: NSCoder)
. Así que finalmente actualicésetup()
el siguiente.fuente
Simplemente deje que se construya y ejecute en el simulador si tiene un error en otro lugar del proyecto, simplemente coméntelo y ejecute el primero para actualizarlo y descomentar los otros códigos. Esto funciona para mi.
fuente