Digamos que quiero init
una UIView
subclase con ay String
an Int
.
¿Cómo haría esto en Swift si solo estoy subclasificando UIView
? Si solo hago una init()
función personalizada pero los parámetros son una Cadena y una Int, me dice que "no se llama a super.init () antes de regresar del inicializador".
Y si llamo super.init()
me dicen que debo usar un inicializador designado. ¿Qué debería estar usando allí? La versión del marco? La versión del codificador? ¿Ambos? ¿Por qué?
fuente
var
. Pero la mejor práctica predeterminada en Swift es declarar variables alet
menos que haya una razón para declararlasvar
. No había tal razón para hacerlo en mi ejemplo de código anterior, por lo tantolet
.init(coder:)
.s
yi
opcional para mantener las cosas simples aquí. Si no fueran opcionales, también tendrían que inicializarse en el inicializador requerido. Hacerlos opcionales significa que pueden sernil
cuandosuper.init()
se llama. Si no fueran opcionales, de hecho tendrían que asignarse antes de llamar a super.init ().Creo un init común para el designado y requerido. Para su comodidad, delego
init(frame:)
con un marco de cero.Tener cero cuadros no es un problema porque normalmente la vista está dentro de la vista de un ViewController; su vista personalizada tendrá una buena y segura oportunidad de diseñar sus subvistas cuando su supervista llame
layoutSubviews()
oupdateConstraints()
. El sistema llama a estas dos funciones de forma recursiva en toda la jerarquía de vistas. Puedes usar cualquieraupdateContstraints()
olayoutSubviews()
.updateContstraints()
se llama primero, luegolayoutSubviews()
. EnupdateConstraints()
asegúrate de llamar super último . EnlayoutSubviews()
, llame a Super primero .Esto es lo que hago:
fuente
commonInit
pasa si desea inicializar algunas propiedades en el método, pero no puede colocarlo despuéssuper
en este caso porque debe inicializar todas las propiedades ANTES de lasuper
llamada? Jajaja parece un bucle muerto.Así es como lo hago en iOS 9 en Swift:
Aquí hay un proyecto completo con ejemplo:
fuente
super.init
, pero él dijo que debería hacerse antessuper.init
...Así es como hago una subvista en iOS en Swift:
fuente