Model2App est une bibliothèque simple qui vous permet de générer rapidement une application IOS CRUD basée sur un modèle de données défini dans Swift. ( CRUD - Créer la mise à jour de lecture Supprimer). Vous avez toujours voulu valider rapidement un modèle de données pour votre prochaine application iOS impressionnante? Model2App vous permet d'économiser des heures / jours en générant une application entièrement fonctionnelle avec la couche de persistance, la validation et bien d'autres fonctionnalités. Définissez simplement votre modèle, frappez ⌘ + R et profitez de votre application. ?
Model2App utilise le royaume ❤️ sous le capot et peut être traité comme son extension dans les activités de développement, en particulier dans la phase de définition ou de validation d'un modèle de données pour un projet plus grand.
✅ Menu d'application basé sur une liste de classes définies par votre application
✅ Visions de liste des objets, pour chaque classe de modèle
✅ View d'objet dynamique pour la création, la mise à jour et la visualisation des objets d'une classe donnée, basée sur la liste des propriétés du modèle
✅ Cellules de propriété d'objet, basées soit sur le type de propriété, soit sur le type de contrôle déclaré (voir les types de contrôle pris en charge ci-dessous)
✅ Logique pour gérer différents types de contrôle pour modifier les valeurs des propriétés de l'objet
✅ Logique de validation pour la création / mise à jour d'objets en utilisant un ensemble de règles prédéfinies ou une personnalité en utilisant une fermeture
✅ Logique pour persister des objets créés dans le stockage local ( Realm )
✅ Logique pour invoquer la session de mise à jour des objets et supprimer des objets
✅ Logique pour établir des relations entre les objets, en cas de propriétés Object
✅ Les sections des objets connexes pour les objets qui sont référencés par d'autres objets (relations inverses)
✅ Logique pour créer un objet connexe à partir d'une vue d'objet donnée
✅ Logique à traverser (infiniment) entre les objets associés
✅ Animations de navigation à zoom-in et à zoom-out
✅ et un tas de nombreuses autres petites fonctionnalités
✅ Ajuster le menu de l'application (mise en page, commande, arrière-plan, icônes / disposition / alphas des éléments de menu, noms / tailles / couleurs, animations et plus)
✅ Choisissez n'importe quelle icône de l'élément de menu dans le paquet fourni ( MenuIcons ), fournissez le vôtre ou laissez Model2App en choisir un pour vous
✅ Ajuster les vues de la liste des objets (mise en page / arrière-plan des cellules, propriétés des objets affichés, disposition des images, animations et plus)
✅ Ajuster les cellules de la propriété de vue de l'objet (disposition / arrière-plan des cellules, noms / tailles / tailles / couleurs, disposition des images, espaces réservés et plus)
✅ Ajuster les en-têtes des objets liés à la vue sur l'objet (disposition / arrière-plan de l'en-tête, noms / tailles / tailles / couleurs)
✅ Ajustez les vues de la liste des cueilleurs (mise en page / arrière-plan des cellules, noms / tailles / tailles / couleurs)
✅ Masquez une classe spécifique dans le menu de l'application ou masquez une propriété spécifique d'une classe donnée à partir de la vue d'objet
✅ Ajuster la configuration de l'animation par défaut: Durée de présentation / licenciement d'animation, rapport d'amortissement ou vitesse de ressort initiale
✅ Spécifiez si les vues d'image présentées dans les cellules doivent être arrondies ou non
✅ prend en charge les iPhones et les iPads
✅ soutient à la fois les orientations de portrait et de paysage
✅ Valide votre modèle de données pour les relations déclarées et les types de contrôle déclarés pour les propriétés
✅ Active l'utilisation du caractère emoji pour l'image d'icône de menu
✅ Flexibilité et extensibilité: En dehors des paramètres de configuration définis dans la classe M2AConfig qui peut être remplacé, la plupart des classes et méthodes utilisées pour les fonctionnalités de l'application de base ont un modificateur d'accès open , afin que vous puissiez personnaliser ou étendre les parties sélectionnées de Framework Model2App dans votre application
✏️ 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 via CocoAPods et Carthage.
Afin d'installer Model2App via des cocoapodes, ajoutez simplement la ligne suivante à votre podfile:
pod 'Model2App'Puis exécutez la commande suivante:
$ pod install Afin d'installer Model2App via Carthage, ajoutez simplement la ligne suivante à votre cartouche:
github "Q-Mobile/Model2App" ~> 0.1.0
Puis exécutez la commande suivante:
$ carthage update N'oubliez pas Carthage/Build/* ajouter tous les Model2App.framework *.framework
Après l'installation de Model2App , définissez simplement votre modèle de données en sous-classant ModelClass , comme dans l'exemple ci-dessous ou comme dans l'exemple d'application disponible dans ce repo ( Model2AppTestApp ) et appuyez sur ⌘ + R . (Remarque: Exemple de modèle de données visible ci-dessous n'est qu'un petit extrait de l'application d'exemple, veuillez vous référer à la source Model2AppTestApp pour un modèle plus étendu)
@ 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 vous souhaitez personnaliser la configuration de classe / propriété par défaut, remplacez simplement certaines ou toutes les propriétés de type calculé définies par 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 personnalisable: ✏️ displayName - Nom d'affichage de cette classe. Si ce n'est pas fourni, déduit du nom de la classe
✏️ pluralName - Nom pluriel de cette classe. Utilisé pour nommer la liste des objets ou des éléments de menu. Si ce n'est pas fourni, <ClassName> - List est utilisée
✏️ menuIconFileName - Nom du fichier image utilisé pour l'icône de menu dans le menu racine de l'application
✏️ menuIconIsFromAppBundle - Spécifie si Model2App doit rechercher un fichier d'icône de menu dans le pack d'applications principal. Si false , le bundle de Model2App sera utilisé
✏️ menuOrder - Commande de l'élément de menu pour cette classe dans le menu racine de l'application
✏️ propertyConfigurations - Dictionnaire des configurations de propriété pour cette classe
✏️ inverseRelationships - Liste des relations inverses pour cette classe (devrait être définie s'il existe des relations to-one une autre classe et si vous souhaitez présenter une section d'objets connexes)
✏️ listViewCellProperties - Liste des propriétés utilisées dans les cellules de la liste de la liste pour cette classe. Doit contenir toutes les propriétés spécifiées dans listViewCellLayoutVisualFormats
✏️ listViewCellLayoutVisualFormats - Liste des formats visuels pour la mise en page des cellules de vue de liste, en utilisant le langage du format visuel de mise en page d'Apple
✏️ isHiddenInRootView - Spécifie si une classe de modèle donnée doit être cachée dans le menu racine de l'application (utile en cas d'entités enfants qui ne devraient être affichées que dans la section des objets connexes, pour un objet donné)
PropertyConfiguration des propriétés: ✏️ controlType - Spécifie le type de contrôle d'interface utilisateur utilisé pour cette propriété
✏️ placeholder - Spécifie la valeur d'espace réservé utilisé lorsqu'aucune valeur n'est fournie pour cette propriété
✏️ pickerValues - Spécifie la liste des valeurs potentielles de sélecteur pour cette propriété. VALIDE UNIQUEMENT pour TextPicker ControlType
✏️ validationRules - Spécifie la liste des règles de validation pour cette propriété (évaluée lors de la création d'un nouvel objet de cette classe)
✏️ isHidden - Spécifie si cette propriété doit être cachée sur l'interface utilisateur
ValidationRule ): ✏️ Required
✏️ MinLength(length: Int)
✏️ MaxLength(length: Int)
✏️ MinValue(value: Double)
✏️ MaxValue(value: Double)
✏️ Email
✏️ URL
✏️ Custom(isValid: (ModelClass) -> Bool)
La classe M2AConfig définit la configuration de l'application par défaut qui peut être éventuellement sous-classée par l'application. Veuillez vous référer à la source de la classe M2AConfig et au fichier AppConfig.swift dans l'application Model2AppTestApp Exemple.
Model2App utilise le royaume sous le capot, il a donc des considérations similaires que pour la définition du modèle:@objc dynamic var (ou simplement dynamic var si la classe elle-même est déclarée à l'aide objcMembers ), à l'exception de la OptionalProperty (utilisée pour les nombres / bool), qui doit être déclarée unique en let .OptionalProperty (ALIAS pour Realm's RealmOptional ). Le répertoire Model2AppTestApp dans ce repo contient un exemple d'application qui définit un modèle de données lié à CRM très simple. Ouvrez Model2AppTestApp/Model2AppTestApp.xcworkspace et exécutez cette application de test pour voir quels sont les effets de l'application de la bibliothèque Model2App à un exemple de modèle de données.
0.1.0 de Model2App ne gère pas les migrations du modèle de données, donc si vous modifiez votre modèle de données après le lancement initial de l'application, vous obtiendrez une erreur et vous devrez supprimer l'application, avant le prochain lancement, afin de voir le modèle mis à jour. La gestion des migrations du modèle est prévue dans la feuille de route pour les versions futures.
OptionalProperty , vous ne pouvez pas utiliser #keyPath pour référencer une propriété donnée en toute sécurité (par exemple à partir de la définition propertyConfigurations ou listViewCellProperties )
La version 0.1.0 de Model2App contient un ensemble limité de fonctionnalités. Il existe de nombreuses fonctionnalités qui pourraient étendre sa valeur:
☘️ Recherche sur les vues de liste d'objets
☘️ Filtrage sur les vues de liste d'objets
☘️ Triage des vues de liste d'objets
☘️ Gestion des suppressions de cascade
☘️ Gestion des migrations du modèle
☘️ Prise en charge du type de contrôle: "curseur"
☘️ Prise en charge du type de contrôle: "TextView"
☘️ Prise en charge du type de contrôle: "Bouton"
☘️ Le soutien aux relations un-à-plusieurs (jusqu'à présent, seules les relations inverses de l'inverse sont soutenues)
☘️ Option pour utiliser les emoji comme icône d'élément de menu, au lieu d'images
☘️ ... et bien d'autres! Restez à l'écoute! ❤️
??? N'hésitez pas à contribuer à Model2App en créant une demande de traction, en suivant ces directives:
Model2App ? Les icônes utilisées par Model2App ont été conçues par Lucy G de Flaticon
Un merci spécial à toutes les personnes derrière le royaume
? Karol Kulesza (@karolkulesza)
? Model2App est disponible sous la licence MIT. Voir le fichier de licence pour plus d'informations.