Model2App es una biblioteca simple que le permite generar rápidamente una aplicación CRUD iOS basada solo en un modelo de datos definido en Swift. ( CRUD - Crear actualización de lectura Eliminar). ¿Alguna vez quisiste validar rápidamente un modelo de datos para tu próxima aplicación de iOS increíble? Model2App le permite ahorrar horas/días generando una aplicación completamente en funcionamiento con capa de persistencia, validación y muchas más características. Simplemente defina su modelo, presione ⌘ + R y disfrute de su aplicación. ?
Model2App utiliza reino ❤️ bajo el capó y puede tratarse como su extensión en las actividades de desarrollo, especialmente en la fase de definir o validar un modelo de datos para un proyecto más grande.
✅ Menú de la aplicación basado en una lista de clases definidas por su aplicación
✅ Vistas de la lista de objetos, según cada clase de modelo
✅ Vista de objetos dinámicos para crear, actualizar y ver objetos de una clase dada, basada en la lista de propiedades del modelo
✅ Celdas de propiedad del objeto, basadas en el tipo de propiedad o en el tipo de control declarado (consulte los tipos de control admitidos a continuación)
✅ Lógica para manejar diferentes tipos de control para cambiar los valores de las propiedades del objeto
✅ Lógica de validación para crear/actualizar objetos utilizando un conjunto de reglas predefinidas o una personalizada utilizando un cierre
✅ Lógica para persistir objetos creados en el almacenamiento local ( Realm )
✅ Lógica para invocar la sesión de actualización de objetos y eliminar objetos
✅ Lógica para establecer relaciones entre objetos, en caso de propiedades Object
✅ Secciones de objetos relacionados para objetos a los que se hace referencia a otros objetos (relaciones inversas)
✅ Lógica para crear un objeto relacionado a partir de una vista de objeto dada
✅ La lógica atraviesa (infinitamente) entre objetos relacionados
✅ Animaciones de navegación Zoom-In y Zoom fuera de la caja
✅ y un grupo de muchas más características pequeñas
✅ Ajuste el menú de aplicaciones (diseño, pedido, fondo, iconos/diseño/alfas de elementos del menú, nombres de fuentes/tamaños/colores, animaciones y más)
✅ Elija cualquier icono de elemento de menú desde el paquete proporcionado ( MenuIcons ), proporcione el suyo o deje que Model2App elija uno para usted
✅ Ajuste las vistas de la lista de objetos (diseño/fondo de celda, propiedades de objetos mostradas, diseño de imágenes, animaciones y más)
✅ Ajuste las celdas de propiedad de la vista de objeto (diseño/fondo de celda, nombres/tamaños/colores de fuentes, diseño de imágenes, marcadores de posición y más)
✅ Ajuste los encabezados de los objetos relacionados con la vista de objetos (diseño/fondo del encabezado, nombres de fuentes/tamaños/colores)
✅ Ajuste las vistas de la lista de seleccionadores (diseño/fondo de celda, nombres de fuentes/tamaños/colores)
✅ Ocultar una clase específica del menú de la aplicación u ocultar una propiedad específica de una clase dada desde la vista de objeto
✅ Ajuste la configuración de animación predeterminada: duración de animación de presentación/despido, relación de amortiguación o velocidad de resorte inicial
✅ Especifique si las vistas de imagen presentadas en las celdas deben ser redondeadas o no
✅ Admite tanto iPhones como iPads
✅ Admite orientaciones de retrato y paisaje
✅ Valida su modelo de datos para las relaciones declaradas y tipos de control declarados para propiedades
✅ habilita el uso de un personaje emoji para la imagen del icono del menú
✅ Flexibilidad y extensibilidad: aparte de los parámetros de configuración definidos en la clase M2AConfig que se puede anular, la mayoría de las clases y métodos utilizados para las características de la aplicación central tienen un modificador de acceso open , por lo que puede personalizar o extender las partes seleccionadas del marco Model2App en su aplicación
✏️ TextField
✏️ NumberField
✏️ FloatDecimalField
✏️ DoubleDecimalField
✏️ CurrencyField
✏️ PhoneField
✏️ EmailField
✏️ PasswordField
✏️ URLField
✏️ ZIPField
✏️ Switch
✏️ DatePicker
✏️ TimePicker
✏️ DateTimePicker
✏️ TextPicker
✏️ ObjectPicker
✏️ ImagePicker
✅ xcode 10.1+
✅ Swift 4.2+
Model2App está disponible a través de Cocoapods y Cartago.
Para instalar Model2App a través de Cocoapods, simplemente agregue la siguiente línea a su Podfile:
pod 'Model2App'Luego ejecute el siguiente comando:
$ pod install Para instalar Model2App a través de Carthage, simplemente agregue la siguiente línea a su Cartfile:
github "Q-Mobile/Model2App" ~> 0.1.0
Luego ejecute el siguiente comando:
$ carthage update Recuerde agregar todos los archivos *.framework desde Carthage/Build/* a su proyecto (no solo Model2App.framework ), aparte de otros pasos estándar para Carthage
Después de instalar Model2App , simplemente defina su modelo de datos subclasificando ModelClass , como en el ejemplo a continuación o como en la aplicación de ejemplo disponible en este repositorio ( Model2AppTestApp ) y presione ⌘ + R (Nota: el modelo de datos de muestra visible a continuación es solo un pequeño extracto de la aplicación Ejemplo, consulte la fuente Model2AppTestApp para un modelo más extendido)
@ objcMembers class Company : ModelClass {
dynamic var name : String ?
dynamic var phoneNumber : String ?
dynamic var industry : String ?
}
@ objcMembers class Person : ModelClass {
dynamic var firstName : String ?
dynamic var lastName : String ?
dynamic var salutation : String ?
dynamic var phoneNumber : String ?
dynamic var privateEmail : String ?
dynamic var workEmail : String ?
let isKeyOpinionLeader = OptionalProperty < Bool > ( )
dynamic var birthday : Date ?
dynamic var website : String ?
dynamic var note : String ?
dynamic var picture : Data ?
dynamic var company : Company ?
}
@ objcMembers class Deal : ModelClass {
dynamic var name : String ?
let value = OptionalProperty < Int > ( )
dynamic var stage : String ?
dynamic var closingDate : Date ?
dynamic var company : Company ?
} Si desea personalizar la configuración de clase/propiedad predeterminada, simplemente anule algunas o todas las propiedades de tipo calculadas definidas por ModelClass :
@ objcMembers class Company : ModelClass {
// (model properties defined earlier)
override class var pluralName : String { return " Companies " }
override class var menuIconFileName : String { return " users " }
override class var menuOrder : Int { return 2 }
override class var inverseRelationships : [ InverseRelationship ] {
return [
InverseRelationship ( " employees " , sourceType : Person . self , sourceProperty : #keyPath ( Person . company ) ) ,
InverseRelationship ( " deals " , sourceType : Deal . self , sourceProperty : #keyPath ( Deal . company ) )
]
}
override class var propertyConfigurations : [ String : PropertyConfiguration ] {
return [
#keyPath ( name ) : PropertyConfiguration (
placeholder : " Enter company name " ,
validationRules : [ . Required ]
) ,
#keyPath ( phoneNumber ) : PropertyConfiguration (
placeholder : " Enter phone number "
) ,
#keyPath ( industry ) : PropertyConfiguration (
controlType : . TextPicker ,
pickerValues : [ " Consulting " , " Education " , " Financial Services " , " Government " , " Manufacturing " , " Real Estate " , " Technology " , " Other " ]
)
]
}
}
@ objcMembers class Person : ModelClass {
// (model properties defined earlier)
override class var pluralName : String { return " People " }
override class var menuIconFileName : String { return " user-1 " }
override class var menuIconIsFromAppBundle : Bool { return true }
override class var menuOrder : Int { return 1 }
override class var listViewCellProperties : [ String ] {
return [ #keyPath ( picture ) , #keyPath ( firstName ) , #keyPath ( lastName ) ]
}
override class var listViewCellLayoutVisualFormats : [ String ] {
return [
" H:|-10-[picture]-[firstName]-5-[lastName(>=50)]-| " // OR: (with slightly weaker readability but more safe): "H:|-10-[#keyPath(picture)]-[#keyPath(firstName)]-5-[#keyPath(lastName)(>=50)]"
]
}
override class var propertyConfigurations : [ String : PropertyConfiguration ] {
return [
#keyPath ( firstName ) : PropertyConfiguration (
controlType : . TextField ,
placeholder : " Enter first name " ,
validationRules : [ . Required ]
) ,
#keyPath ( lastName ) : PropertyConfiguration (
controlType : . TextField ,
placeholder : " Enter last name " ,
validationRules : [ . Required ]
) ,
#keyPath ( salutation ) : PropertyConfiguration (
controlType : . TextPicker ,
pickerValues : [ " Mr. " , " Ms. " , " Mrs. " , " Dr. " , " Prof. " ] ,
validationRules : [ . Required ]
) ,
#keyPath ( phoneNumber ) : PropertyConfiguration (
controlType : . PhoneField ,
placeholder : " Enter phone number " ,
validationRules : [ . MinLength ( length : 9 ) , . MaxLength ( length : 12 ) ]
) ,
#keyPath ( privateEmail ) : PropertyConfiguration (
controlType : . EmailField ,
placeholder : " Enter email address " ,
validationRules : [ . Email ]
) ,
#keyPath ( workEmail ) : PropertyConfiguration (
controlType : . EmailField ,
placeholder : " Enter email address " ,
validationRules : [ . Required , . Email , . Custom ( isValid : { object in
if let workEmail = object [ #keyPath ( workEmail ) ] as? String ,
let privateEmail = object [ #keyPath ( privateEmail ) ] as? String ,
workEmail == privateEmail {
UIUtilities . showValidationAlert ( " Work Email cannot be the same as Private Email. " )
return false
}
return true
} ) ]
) ,
#keyPath ( birthday ) : PropertyConfiguration (
controlType : . DatePicker ,
validationRules : [ . Required ]
) ,
#keyPath ( website ) : PropertyConfiguration (
controlType : . URLField ,
placeholder : " Enter URL " ,
validationRules : [ . URL ]
) ,
#keyPath ( note ) : PropertyConfiguration (
controlType : . TextField ,
placeholder : " Enter note " ,
validationRules : [ . MaxLength ( length : 1000 ) ]
) ,
#keyPath ( company ) : PropertyConfiguration (
validationRules : [ . Required ]
) ,
#keyPath ( picture ) : PropertyConfiguration (
controlType : . ImagePicker
)
]
}
}
@ objcMembers class Deal : ModelClass {
// (model properties defined earlier)
override class var pluralName : String { return " Deals " }
override class var menuIconFileName : String { return " money " }
override class var listViewCellProperties : [ String ] {
return [ #keyPath ( name ) , " value " , #keyPath ( stage ) ]
}
override class var listViewCellLayoutVisualFormats : [ String ] {
return [
" H:|-10@750-[name(>=50)]-(>=10)-[value(>=50)]-| " ,
" H:|-10@750-[stage]-(>=10)-[value] " ,
" V:|-10@750-[value]-10@750-| " ,
" V:|-10@750-[name]-[stage]-| "
]
}
override class var propertyConfigurations : [ String : PropertyConfiguration ] {
return [
#keyPath ( name ) : PropertyConfiguration (
controlType : . TextField ,
placeholder : " Enter deal name " ,
validationRules : [ . Required ]
) ,
" value " : PropertyConfiguration (
controlType : . CurrencyField ,
placeholder : " Enter deal value " ,
validationRules : [ . Required ]
) ,
#keyPath ( stage ) : PropertyConfiguration (
controlType : . TextPicker ,
pickerValues : [ " Prospecting " , " Qualified " , " Reviewed " , " Quote " , " Won " , " Lost " ] ,
validationRules : [ . Required ]
) ,
#keyPath ( company ) : PropertyConfiguration (
validationRules : [ . Required ]
)
]
}
} ModelClass personalizable: ✏️ displayName - Nombre de visualización de esta clase. Si no se proporciona, se infiere del nombre de la clase
✏️ pluralName - Nombre plural de esta clase. Se utiliza para nombrar la lista de objetos o elementos de menú. Si no se proporciona, <ClassName> - List
✏️ menuIconFileName - Nombre del archivo de imagen utilizado para el icono del menú en el menú root de la aplicación
✏️ menuIconIsFromAppBundle : especifica si Model2App debe buscar el archivo de icono de menú en el paquete de aplicaciones principales. Si false , se utilizará el paquete de Model2App
✏️ menuOrder - Orden del elemento de menú para esta clase en el menú raíz de la aplicación
✏️ propertyConfigurations - Diccionario de configuraciones de propiedades para esta clase
✏️ inverseRelationships : lista de relaciones inversas para esta clase (debe definirse si hay to-one relación de otras clases y si desea presentar una sección de objetos relacionados)
✏️ listViewCellProperties - Lista de propiedades utilizadas en las celdas de vista de lista para esta clase. Debe contener todas las propiedades especificadas en listViewCellLayoutVisualFormats
✏️ listViewCellLayoutVisualFormats - Lista de formatos visuales para el diseño de la celda de la vista de lista, utilizando el diseño de formato visual de diseño automático de Apple
✏️ isHiddenInRootView : especifica si una clase de modelo determinada debe estar oculta en el menú raíz de la aplicación (útil en el caso de entidades infantiles que solo deben mostrarse en la sección de objetos relacionados, para un objeto dado)
PropertyConfiguration 's Propiedades: ✏️ controlType : especifica el tipo de control de la interfaz de usuario utilizado para esta propiedad
✏️ placeholder : especifica el valor del marcador de posición utilizado cuando no se proporciona ningún valor para esta propiedad
✏️ pickerValues : especifica la lista de valores potenciales de selección para esta propiedad. Válido solo para TextPicker ControlType
✏️ validationRules : especifica la lista de reglas de validación para esta propiedad (evaluada al crear un nuevo objeto de esta clase)
✏️ isHidden : especifica si esta propiedad debe estar oculta en la interfaz de usuario
ValidationRule ): ✏️ Required
✏️ MinLength(length: Int)
✏️ MaxLength(length: Int)
MinValue(value: Double)
✏️ MaxValue(value: Double)
✏️ Email
✏️ URL
✏️ Custom(isValid: (ModelClass) -> Bool)
La clase M2AConfig define la configuración predeterminada de la aplicación que puede ser opcionalmente subclasificada por la aplicación. Consulte tanto la fuente de clase M2AConfig como el archivo AppConfig.swift en la aplicación de ejemplo Model2AppTestApp .
Model2App usa reino debajo del capó, por lo que tiene consideraciones similares a la definición del modelo:@objc dynamic var (o simplemente dynamic var si la clase en sí se declara utilizando objcMembers ), excepto la OptionalProperty (utilizada para números/bool), que debe declararse usando solo let .OptionalProperty (alias para RealmOptional ). El directorio Model2AppTestApp en este repositorio contiene una aplicación de ejemplo que define un modelo de datos relacionado con CRM muy simple. Abra Model2AppTestApp/Model2AppTestApp.xcworkspace y ejecute esta aplicación de prueba para ver cuáles son los efectos de aplicar la biblioteca Model2App a un modelo de datos de muestra.
0.1.0 de Model2App no maneja las migraciones del modelo de datos, por lo que si cambia su modelo de datos después del lanzamiento de la aplicación inicial, recibirá un error y tendrá que eliminar la aplicación, antes del próximo lanzamiento, para ver el modelo actualizado. El manejo de las migraciones de modelos se planifica en la hoja de ruta para futuros lanzamientos.
OptionalProperty , no puede usar #keyPath para hacer referencia de forma segura a una propiedad dada (por ejemplo, de propertyConfigurations o listViewCellProperties Definición)
La versión 0.1.0 de Model2App contiene un conjunto limitado de características. Hay muchas funcionalidades que podrían extender su valor:
☘️ Buscando en las vistas de la lista de objetos
☘️ Filtrando en las vistas de la lista de objetos
☘️ Clasificación en las vistas de la lista de objetos
☘️ Manejo de deleciones en cascada
☘️ Manejo de migraciones de modelo
☘️ Soporte para el tipo de control: "Slider"
☘️ Soporte para el tipo de control: "TextView"
☘️ Soporte para el tipo de control: "botón"
☘️ Apoyo para las relaciones de uno a muchos (hasta ahora solo se apoyan las relaciones inversas de uno a muchos)
☘️ Opción para usar emoji como icono de elemento de menú, en lugar de imágenes
☘️ ... y muchos más! ¡Manténganse al tanto! ❤️
??? Siéntase libre de contribuir a Model2App creando una solicitud de extracción, siguiendo estas pautas:
Model2App ? Los iconos utilizados por Model2App fueron diseñados por Lucy G de Flaticon
Un agradecimiento especial a todas las personas detrás del reino
? Karol Kulesza (@karolkulesza)
? Model2App está disponible bajo la licencia MIT. Consulte el archivo de licencia para obtener más información.