ios - example - ibinspectable bool
@IB Agente de bloqueo designable (10)
Cuando escribo mi propia clase
UIButton
-extended y la hago
@IBDesignable
, recibo dos errores en Interface Builder, a saber:
- Main.storyboard: error: IB Designables: Error al actualizar el estado del diseño automático: el agente se bloqueó porque el fd se cerró
- Main.storyboard: error: IB Designables: no se pudo procesar la instancia de RandjeUIButton: el agente se bloqueó
Aquí está mi código:
import UIKit
@IBDesignable
class RandjeUIButton: UIButton {
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.backgroundColor = UIColor.blackColor()
}
}
Estoy trabajando en Xcode 7 beta 2 en OS X 10.11 beta 2. (Ejecutando en VM)
Así es como resuelvo este problema:
- Asegúrese de que las salidas estén correctamente inicializadas
- Las propiedades de @IBInspectable se inicializarían correctamente
- en el archivo xib, haga clic en el marcador de posición del propietario del archivo, vaya al inspector de identidad, asegúrese de que no tenga valores predeterminados
import UIKit
@IBDesignable class TestView: UIView {
@IBOutlet weak var label: UILabel!
@IBInspectable var textLabel1: String? {
get {
return label.text
}
set {
label.text = newValue
}
}
// MARK: Setup
var view1: UIView!
var nibName: String = "TestView"
override init(frame: CGRect) {
super.init(frame: frame)
xibSetup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
xibSetup()
}
private func xibSetup() {
view1 = loadViewFromNib()
view1?.frame = self.bounds
view1?.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
if view1 != nil {
addSubview(view1!)
//textLabel1 = "ok"
}
}
private func loadViewFromNib() -> UIView? {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: nibName, bundle: bundle)
for object in nib.instantiateWithOwner(self, options: nil) {
if let view: UIView = object as? UIView {
return view
}
}
return nil
}
}
Uso:
El generador de interfaces de Xcode requiere que implemente
ambos
o
ninguno de los
inicializadores para que
@IBDesignable
clases
@IBDesignable
se representen correctamente en IB.
Si implementa
required init(coder aDecoder: NSCoder)
necesario, también deberá anular
init(frame: CGRect)
, de lo contrario "el agente se bloqueará" como se ve en los errores arrojados por Xcode.
Para hacerlo, agregue el siguiente código a su clase:
override init(frame: CGRect) {
super.init(frame: frame)
}
En Xcode 7.3, ninguna de las soluciones anteriores funcionó para mí, pero la respuesta aceptada a esta pregunta fue: No se pudo procesar la instancia de Designables de IB
- Borrar datos derivados de Xcode para el proyecto. Están en ~ / Library / Developer / Xcode / DerivedData
- Limpia tu construcción actual presionando ⌘⇧K
- Construye tu proyecto
- En el guión gráfico, vaya al menú Editor y actualice todas las vistas; espere a que se complete la compilación y los errores deberían desaparecer
No necesitaba hacer el cuarto paso para resolver el problema (y obtener mi PaintCode-drawRect''d UIView para pintar en el guión gráfico), incluido aquí por si acaso.
Crédito a @Mojtaba y @WeZZard
Encontré algo realmente importante al usar un UIImage en cualquier clase marcada @IBDesignable. El clásico UIImage init colapsaría al agente:
let myImage = UIImage(named: String) // crash the agent
La solución es usar este método init de UIImage:
let myImage = UIImage(named: String, in: Bundle, compatibleWith: UITraitCollection)
Código de trabajo ejemplo:
let appBundle = Bundle(for: type(of: self))
let myImage = UIImage(named: "myImage", in: bundle, compatibleWith: self.traitCollection))
¿Dónde está tu clase con la palabra clave @IBDesignable? Xcode 9.4, Swift 4.1
Hay una miríada de problemas que pueden causar esto.
Encienda la consola y busque el informe de bloqueo
IBDesignablesCocoaTouch...
Acabo de resolver un problema con un tercero designado que tenía problemas con la semántica
valueForKey
.
He encontrado el mismo problema y lo he resuelto de esta manera:
- El problema:
error: Designables de IB: no se pudo actualizar el estado del diseño automático: el agente se bloqueó
- Busque el botón de depuración en el archivo de inspección y haga clic en él.
-
Entonces el Xcode te dirá dónde está el prolem. En mi caso, dejo caer el
IBDesignable
antes de la clase. -
Luego lo limpio y lo reconstruyo, el error desapareció
Para mí, no fue usar
#if !TARGET_INTERFACE_BUILDER
que me
#if !TARGET_INTERFACE_BUILDER
.
Básicamente tenía un código que daría como resultado el acceso a una ruta en mi paquete ...
Bundle.main.path(forResource: "Foo", ofType: "plist")
El problema es que cuando se ejecuta en IB (y no en su aplicación),
Bundle.main
no es su aplicación ...
(lldb) po Bundle.main
NSBundle </Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/Library/Xcode/Overlays> (loaded)
Entonces, la respuesta a esto es simplemente revisar su código
@IBDesignable UIView
cuidadosamente y usar
#if !TARGET_INTERFACE_BUILDER
para cualquier cosa (en mi caso, llamadas a
CoreLocation
por ejemplo) que no tiene sentido cuando se ejecuta en tiempo de diseño.
Cómo depuré y encontré esto
Esto es lo que ve cuando usa el
Editor -> Debug Selected View
seleccionada mientras selecciona su
@IBDesignable UIView
en su guión gráfico:
Luego te estrellarás en la ubicación correcta
En mi caso, como puede ver,
initXXXX
estaba haciendo una
initXXXX
, que se bloqueaba en el momento del diseño, porque estaba buscando un valor en el archivo en mi Bundle, que es Xcode, en el momento del diseño.
Simplemente vuelva a abrir un código en otro sistema de configuración de Xcode. En mi caso funcionó.
XCode 10, Swift 4.2
Encontré una respuesta here
La solución fue simple: cambiar la forma en que se resolvió el paquete en el método
required init?(coder aDecoder: NSCoder)
de mi clase de vista personalizada.
Bundle.main.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)
necesitaba ser cambiado a
let bundle = Bundle(for: TestView.self)
bundle.loadNibNamed(String(describing: TestView.self), owner: self, options: nil)