Model2App ist eine einfache Bibliothek, mit der Sie schnell eine CRUD -IOS -App erstellen können, die nur auf einem in Swift definierten Datenmodell basiert. ( CRUD - Erstellen Sie das Lesen von Update löschen). Wollten Sie schon immer schnell ein Datenmodell für Ihre nächste fantastische iOS -App validieren? Model2App können Sie Stunden/Tage sparen, indem Sie eine vollständig funktionierende App mit Persistenzschicht, Validierung und vielen weiteren Funktionen generieren. Definieren Sie einfach Ihr Modell, klicken Sie auf ⌘ + R und genießen Sie Ihre App. ?
Model2App verwendet Realm ❤️ unter der Motorhaube und kann als Erweiterung der Entwicklungsaktivitäten behandelt werden, insbesondere in der Phase der Definition oder Validierung eines Datenmodells für ein größeres Projekt.
✅ App -Menü basierend auf einer Liste von Klassen, die von Ihrer App definiert sind
✅ Objekte listen Ansichten pro Modellklasse auf
✅ Dynamische Objektansicht zum Erstellen, Aktualisieren und Anzeigen von Objekten einer bestimmten Klasse, basierend auf der Liste der Modelleigenschaften
✅ Objekteigenschaftszellen, die entweder auf dem Eigenschaftstyp oder auf dem deklarierten Kontrolltyp basieren (siehe unten unterstützte Kontrolltypen)
✅ Logik, um verschiedene Steuertypen zu verarbeiten, um die Werte von Objekteigenschaften zu ändern
✅ Validierungslogik zum Erstellen/Aktualisieren von Objekten mithilfe von vordefinierten Regeln oder benutzerdefinierten Verschlüssen unter Verwendung eines Verschlusses
✅ Logik für anhaltende erstellte Objekte im lokalen Speicher ( Realm )
✅ Logik zum Aufrufen von Objekt -Update -Sitzungen und Löschen von Objekten
✅ Logik zum Festlegen von Beziehungen zwischen Objekten im Fall von Object
✅ Verwandte Objektabschnitte für Objekte, auf die von anderen Objekten (inverse Beziehungen) verwiesen wird
✅ Logik zum Erstellen eines verwandten Objekts aus einer bestimmten Objektansicht
✅ Logik zum Durchqueren (unendlich) zwischen verwandten Objekten
✅ Aus dem Box Zoom-In & Zoom-Out-Navigationsanimationen
✅ & ein paar weitere kleine Funktionen
✅ App -Menü (Layout, Bestellung, Hintergrund, Menüelemente 'Symbole/Layout/Alphas, Schriftnamen/Größen/Farben, Animationen und mehr) anpassen
✅ Wählen Sie ein beliebiges Menüelement -Symbol aus dem bereitgestellten Bundle ( MenuIcons ), geben Sie Ihr eigenes an oder lassen Sie Model2App eine für Sie auswählen
✅ Objekte Listenansichten anpassen (Zelllayout/Hintergrund, angezeigte Objekteigenschaften, Bilderlayout, Animationen und mehr)
✅ Passen Sie die Eigenschaftszellen der Objektansicht an (Zelllayout/Hintergrund, Schriftnamen/Größen/Farben, Bilderlayout, Platzhalter und mehr)
✅ Passen Sie die Header der Objekte der Objekte an (Header -Layout/Hintergrund, Schriftnamen/Größen/Farben).
✅ Passen Sie die Ansichten der Picker -Liste an (Zelllayout/Hintergrund, Schriftnamen/Größen/Farben)
✅ Ausblenden Sie eine bestimmte Klasse aus dem App -Menü oder ausblenden Sie eine bestimmte Eigenschaft einer bestimmten Klasse aus der Objektansicht
✅ Passen Sie die Standardanimationskonfiguration an: Präsentations-/Entlassungsanimationsdauer, Dämpfungsverhältnis oder anfängliche Federgeschwindigkeit
✅ Geben Sie an, ob in den Zellen dargestellte Bildansichten abgerundet werden sollten oder nicht
✅ Unterstützt sowohl iPhones als auch iPads
✅ Unterstützt sowohl Porträt- als auch Landschaftsorientierungen
✅ Validiert Ihr Datenmodell für deklarierte Beziehungen und deklarierte Kontrolltypen für Eigenschaften
✅ Aktiviert die Verwendung von Emoji -Zeichen für Menü -Symbolbild
✅ Flexibilität und Erweiterbarkeit: Abgesehen von Konfigurationsparametern, die in der M2AConfig -Klasse definiert werden können, die überschrieben werden können, open die meisten Klassen und Methoden, die für Kern Model2App -Funktionen verwendet werden
✏️ TextField
✏️ NumberField
✏️ FloatDecimalField
✏️ DoubleDecimalField
✏️ CurrencyField
✏️ PhoneField
✏️ EmailField
✏️ PasswordField
✏️ URLField
✏️ ZIPField
✏️ Switch
✏️ DatePicker
✏️ TimePicker
✏️ DateTimePicker
✏️ TextPicker
✏️ ObjectPicker
✏️ ImagePicker
✅ Xcode 10.1+
✅ Swift 4.2+
Model2App ist sowohl über Cocoapods als auch über Karthago erhältlich.
Um Model2App über Cocoapods zu installieren, fügen Sie einfach die folgende Zeile Ihrer Podfile hinzu:
pod 'Model2App'Führen Sie dann den folgenden Befehl aus:
$ pod install Um Model2App über Carthago zu installieren, fügen Sie einfach die folgende Zeile zu Ihrem Cartfile hinzu:
github "Q-Mobile/Model2App" ~> 0.1.0
Führen Sie dann den folgenden Befehl aus:
$ carthage update Bitte denken Sie daran, alle *.framework -Dateien von Carthage/Build/* zu Ihrem Projekt hinzuzufügen (nicht nur Model2App.framework ), abgesehen von anderen Standardschritten für Carthage
Definieren Sie nach der Installation von Model2App Ihr Datenmodell einfach durch ModelClass , wie in Beispiel unten oder wie in Beispiel -Apps, die in diesem Repo verfügbar sind ( Model2AppTestApp ), und drücken Sie ⌘ + R . (Hinweis: Das unten sichtbare Beispieldatenmodell ist nur ein kleiner Auszug aus der Beispiel -App. Weitere Informationen finden Sie unter Model2AppTestApp -Quelle für ein erweitertes Modell.
@ 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 ?
} Wenn Sie die Standardklassen-/Eigenschaftskonfiguration anpassen möchten, überschreiben Sie einfach einige oder alle von der ModelClass definierten Eigenschaften des Computertyps:
@ 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 Typeigenschaften: ✏️ displayName - Anzeigename dieser Klasse. Wenn nicht angegeben, aus dem Klassennamen abgeleitet
✏️ pluralName - Pluralname dieser Klasse. Wird verwendet, um die Liste der Objekte oder Menüelemente zu benennen. Wenn nicht angegeben, wird <ClassName> - List verwendet
✏️ menuIconFileName - Name der Bilddatei, die für das Menüsymbol im Stammmenü der App verwendet wird
✏️ menuIconIsFromAppBundle - Gibt an, ob Model2App nach Menüsymboldatei im Haupt -App -Bundle suchen sollte. Wenn false , wird das Bündel von Model2App verwendet
✏️ menuOrder - Reihenfolge des Menüelements für diese Klasse im Root -Menü der App
✏️ propertyConfigurations - Wörterbuch für Eigenschaftskonfigurationen für diese Klasse
✏️ inverseRelationships - Liste inverser Beziehungen für diese Klasse (sollte definiert werden, wenn es to-one Teil anderen Klassen gibt und wenn Sie einen Abschnitt verwandter Objekte vorlegen möchten)
✏️ listViewCellProperties - Liste der Eigenschaften, die in List -Ansichtszellen für diese Klasse verwendet werden. Sollte alle in listViewCellLayoutVisualFormats angegebenen Eigenschaften enthalten
✏️ listViewCellLayoutVisualFormats - Liste der visuellen Formate für Listenansicht Zellenlayout unter Verwendung der visuellen Formatsprache von Apples automatischem Layout
✏️ isHiddenInRootView - Gibt an, ob eine bestimmte Modellklasse im Stammmenü der App verborgen sein sollte (nützlich bei untergeordneten Entitäten, die nur im Abschnitt mit verwandten Objekten für ein bestimmtes Objekt angezeigt werden sollten)
PropertyConfiguration Eigenschaften: ✏️ controlType - Gibt die Art der für diese Eigenschaft verwendeten UI -Steuerung an
✏️ placeholder - Gibt den Platzhalterwert an, der verwendet wird, wenn für diese Immobilie kein Wert bereitgestellt wird
✏️ pickerValues - Gibt die Liste der potenziellen Picker -Werte für diese Eigenschaft an. Nur für TextPicker ControlType gültig
✏️ validationRules - Gibt die Liste der Validierungsregeln für diese Eigenschaft an (bewertet beim Erstellen eines neuen Objekts dieser Klasse)
✏️ isHidden - Gibt an, ob diese Eigenschaft auf der Benutzeroberfläche versteckt sein sollte
ValidationRule ): ✏️ Required
✏️ MinLength(length: Int)
✏️ MaxLength(length: Int)
✏️ MinValue(value: Double)
✏️ MaxValue(value: Double)
✏️ Email
✏️ URL
✏️ Custom(isValid: (ModelClass) -> Bool)
M2AConfig -Klasse definiert die Standard -App -Konfiguration, die optional von der App unterklebt werden kann. In der Datei M2AConfig -Klasse und AppConfig.swift -Datei finden Sie in Model2AppTestApp -Beispiel -App.
Model2App Realm unter der Haube, sodass es ähnliche Überlegungen wie für die Modelldefinition hat:@objc dynamic var (oder nur dynamic var deklariert werden, wenn die Klasse selbst unter Verwendung objcMembers deklariert wird), mit Ausnahme der OptionalProperty (verwendet für Zahlen/BOOL), die mit nur let deklariert werden sollte.OptionalProperty (Alias für RealmOptional ). Das Verzeichnis Model2AppTestApp in diesem Repo enthält eine Beispiel-App, die ein sehr einfaches CRM-bezogenes Datenmodell definiert. OPEN Model2AppTestApp/Model2AppTestApp.xcworkspace und führen Sie diese Test -App aus, um zu sehen, welche Auswirkungen die Anwendung Model2App -Bibliothek auf ein Beispieldatenmodell sind.
0.1.0 von Model2App behandelt keine Datenmodellmigrationen. Wenn Sie also Ihr Datenmodell nach dem Erst -App -Start ändern, erhalten Sie einen Fehler und müssen die App vor dem nächsten Start entfernen, um das aktualisierte Modell anzuzeigen. Umgangsmodellmigrationen sind in Roadmap für zukünftige Veröffentlichungen geplant.
OptionalProperty -Eigenschaften können listViewCellProperties #keyPath nicht verwenden, um eine bestimmte Eigenschaft sicher zu verweisen (z propertyConfigurations
Version 0.1.0 von Model2App enthält einen begrenzten Satz von Funktionen. Es gibt viele Funktionen, die ihren Wert erweitern könnten:
☘️ Suchen Sie auf Objektlistenansichten
☘️ Filterung in Objektlistenansichten
☘️ Sortieren auf Objektlistenansichten
☘️ Handhabung von Kaskadendeletionen
☘️ Handhabungsmodellmigrationen
☘️ Unterstützung für den Steuertyp: "Slider"
☘️ Unterstützung für den Steuertyp: "TextView"
☘️ Unterstützung für den Steuertyp: "Button"
☘️ Unterstützung für Eins-zu-Viele-Beziehungen (bisher werden nur inverse Eins-zu-viele-Beziehungen unterstützt)
☘️ Option zur Verwendung von Emoji als Menüpunktsymbol anstelle von Bildern
☘️ ... und viele mehr! Bleiben Sie dran! ❤️
??? Nehmen Sie sich frei, um zu Model2App beizutragen, indem Sie eine Pull -Anfrage erstellen, folgt folgende Richtlinien:
Model2App ? Die von Model2App verwendeten Ikonen wurden von Lucy G von Flatricon entworfen
Besonderer Dank geht an alle Leute hinter dem Reich
? Karol Kulesza (@karolkulesza)
? Model2App ist unter der MIT -Lizenz verfügbar. Weitere Informationen finden Sie in der Lizenzdatei.