Digamos que quiero inituna UIViewsubclase con ay Stringan 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 aletmenos 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:).syiopcional 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 sernilcuandosuper.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
commonInitpasa si desea inicializar algunas propiedades en el método, pero no puede colocarlo despuéssuperen este caso porque debe inicializar todas las propiedades ANTES de lasuperllamada? 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