Model2App 、Swiftで定義されたデータモデルのみに基づいて、 CRUD iOSアプリをすばやく生成できるシンプルなライブラリです。 ( CRUD読み取り更新削除を作成します)。次の素晴らしいiOSアプリのデータモデルをすばやく検証したかったことはありますか? Model2Appすると、永続レイヤー、検証、およびその他の機能を備えた完全に機能するアプリを生成することにより、時間/日を節約できます。モデルを定義し、 ⌘ + Rを押してアプリをお楽しみください。 ?
Model2App 、フードの下で領域を使用し、特により大きなプロジェクトのデータモデルを定義または検証する段階で、開発活動の拡張として扱うことができます。
✅アプリで定義されたクラスのリストに基づくアプリメニュー
model各モデルクラスごとに、オブジェクトビューをリストします
modelモデルプロパティのリストに基づいて、特定のクラスのオブジェクトを作成、更新、および表示するための動的オブジェクトビュー
✅オブジェクトプロパティセル、プロパティタイプまたは宣言された制御タイプのいずれかに基づいています(以下のサポートされているコントロールタイプを参照)
✅オブジェクトプロパティの値を変更するためのさまざまな制御タイプを処理するロジック
closure閉鎖を使用して、事前定義されたルールのセットまたはカスタム1のセットを使用してオブジェクトを作成/更新するための検証ロジック
✅ローカルストレージで作成されたオブジェクトを持続するためのロジック( Realm )
✅オブジェクトの更新セッションを呼び出してオブジェクトを削除するためのロジックObjectオブジェクトのプロパティの場合に、オブジェクト間の関係を設定するためのロジック
他のオブジェクトによって参照されるオブジェクトの関連オブジェクトのセクション(逆関係)
✅特定のオブジェクトビューから関連するオブジェクトを作成するためのロジック
collent関連するオブジェクト間で(無限に)移動するロジック
boxボックスからズームインとズームアウトナビゲーションアニメーション
and&より多くの小さな機能の束
appアプリメニュー(レイアウト、注文、背景、メニュー項目のアイコン/レイアウト/アルファ、フォント名/サイズ/色、アニメーションなど)の調整
compled提供されたバンドル( MenuIcons )からメニュー項目アイコンを選択するか、独自のものを提供するか、 Model2App選択してください
✅オブジェクトのリストビュー(セルのレイアウト/背景、オブジェクトのプロパティ、画像レイアウト、アニメーションなど)を調整します)
objectオブジェクトビュープロパティセル(セルレイアウト/背景、フォント名/サイズ/色、画像レイアウト、プレースホルダーなど)を調整します)
objectオブジェクトビュー関連オブジェクトのヘッダー(ヘッダーレイアウト/背景、フォント名/サイズ/色)の調整
pickerピッカーリストビューを調整します(セルレイアウト/背景、フォント名/サイズ/色)
appアプリメニューから特定のクラスを非表示にするか、特定のクラスの特定のプロパティをオブジェクトビューから非表示にします
defaultデフォルトのアニメーションの構成を調整します:プレゼンテーション/解雇アニメーションの期間、減衰比、または初期スプリング速度
cell細胞に提示された画像ビューを丸くするべきかどうかを指定します
iPhoneとiPadの両方をサポートします
forate肖像と風景の両方の向きをサポートします
clortions宣言された関係のデータモデルを検証し、プロパティの制御タイプを宣言します
menuメニューアイコン画像に絵文字文字を使用することを有効にします
flex性と拡張性:オーバーライドできるM2AConfigクラスで定義されている構成パラメーターとは別に、コアアプリ機能に使用されるクラスとメソッドのほとんどはopenアクセス修飾子を備えているため、 Model2Appフレームワークの選択した部分をカスタマイズまたは拡張できます。
TextField
✏ NumberField
how FloatDecimalField
DoubleDecimalField
CurrencyField
PhoneField
✏️ EmailField
PasswordField
URLField
✏️ ZIPField
✏✏️ Switch
DatePicker
✏ TimePicker
DateTimePicker
TextPicker
ObjectPicker
ImagePicker
✅Xcode 10.1+
swift 4.2+
Model2App 、CocoapodsとCarthageの両方で利用できます。
Cocoapodsを介してModel2Appをインストールするには、次の行をPodfileに追加するだけです。
pod 'Model2App'次に、次のコマンドを実行します。
$ pod installCarthage経由でModel2Appをインストールするには、次の行をCartfileに追加するだけです。
github "Q-Mobile/Model2App" ~> 0.1.0
次に、次のコマンドを実行します。
$ carthage update Carthage/Build/*のすべての*.frameworkファイルをプロジェクト( Model2App.frameworkだけでなく)に追加することを忘れないでください。
Model2Appをインストールした後、以下の例のように、またはこのレポ( Model2AppTestApp )で利用可能な例のように、 ModelClassをサブクラス化してデータモデルを定義するだけで、 ⌘ + Rをヒットします。 (注:以下に表示されるサンプルデータモデルは、サンプルアプリからの小さな抜粋です。より拡張されたモデルについては、 Model2AppTestAppソースを参照してください)
@ 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 ?
} デフォルトのクラス/プロパティ構成をカスタマイズする場合は、 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タイプのプロパティ: displayNameこのクラスの表示名。提供されていない場合は、クラス名から推測されますpluralNameこのクラスの複数名。オブジェクトまたはメニュー項目のリストに名前を付けるために使用されます。提供されていない場合、 <ClassName> - Listが使用されます
✏✏- menuIconFileName - アプリのルートメニューでメニューアイコンに使用される画像ファイルの名前menuIconIsFromAppBundleメインアプリバンドルでModel2Appメニューアイコンファイルを探すべきかどうかを指定します。 falseの場合、 Model2Appのバンドルが使用されます
anut- menuOrder - アプリのルートメニューでこのクラスのメニュー項目の項目propertyConfigurationsこのクラスのプロパティ構成の辞書
✏️ inverseRelationships - このクラスの逆関係のリスト(他のクラスからのto-one関係がある場合、および関連するオブジェクトのセクションを提示したい場合は定義する必要があります)
listViewCellPropertiesこのクラスのリストビューセルで使用されるプロパティのリスト。 listViewCellLayoutVisualFormatsで指定されたすべてのプロパティを含める必要があります
✏️ listViewCellLayoutVisualFormatsリストビューセルレイアウトの視覚形式のリスト、Appleの自動レイアウトビジュアルフォーマット言語を使用isHiddenInRootView特定のモデルクラスをアプリのルートメニューに非表示にするかどうかを指定します(特定のオブジェクトに対して、関連するオブジェクトセクションにのみ表示される子供エンティティの場合に役立ちます)
PropertyConfigurationのプロパティ: controlTypeこのプロパティに使用されるUIコントロールのタイプを指定しますplaceholderこのプロパティに価値が提供されていないときに使用されるプレースホルダー値を指定しますpickerValuesこのプロパティの潜在的なピッカー値のリストを指定します。 TextPicker ControlTypeに対してのみ有効です
hurth収validationRulesこのプロパティの検証ルールのリストを指定します(このクラスの新しいオブジェクトを作成するときに評価されます)
isHiddenこのプロパティをUIに隠すべきかどうかを指定します
ValidationRule ): ✏️ Required
MinLength(length: Int)
MaxLength(length: Int)
MinValue(value: Double)
MaxValue(value: Double)
✏ Email
URL
✏✏§ Custom(isValid: (ModelClass) -> Bool)
M2AConfigクラスは、アプリでオプションでサブクラス化できるデフォルトのアプリ構成を定義します。 Model2AppTestApp例アプリのM2AConfigクラスソースとAppConfig.swiftファイルの両方を参照してください。
Model2Appフードの下で領域を使用するため、モデル定義と同様の考慮事項があります。let言えば、すべてのモデルプロパティは、 @objc dynamic var (またはクラス自体がobjcMembersを使用して宣言されている場合のOptionalProperty dynamic var )として宣言する必要があります。OptionalProperty (RealmのRealmOptionalのエイリアス)を使用して行われます。 Model2AppTestApp Directoryこのリポジトリには、非常にシンプルなCRM関連データモデルを定義するサンプルアプリが含まれています。 Open Model2AppTestApp/Model2AppTestApp.xcworkspaceを実行し、このテストアプリを実行して、 Model2Appライブラリをサンプルデータモデルに適用する効果を確認します。
Model2Appのバージョン0.1.0データモデルの移行を処理しないため、最初のアプリの起動後にデータモデルを変更すると、エラーが発生し、更新されたモデルを確認するために、次の起動の前にアプリを削除する必要があります。モデルの移行の取り扱いは、将来のリリースのためにロードマップで計画されています。
OptionalPropertyプロパティの場合、 #keyPathを使用して特定のプロパティを安全に参照することはできません(たとえば、 propertyConfigurationsまたはlistViewCellProperties定義など)
Model2Appのバージョン0.1.0には、限られた機能セットが含まれています。その価値を拡張できる多くの機能があります。
Objectオブジェクトリストビューの検索
Objectオブジェクトリストビューのフィルタリング
Objectオブジェクトリストビューでのソート
Cascadeの削除の処理
Model Model Migrationsの取り扱い
コントロールタイプのサポート:「スライダー」
Control Typeのサポート:「TextView」
コントロールタイプのサポート:「ボタン」
☘§1対多くの関係をサポートする(これまでのところ、逆の1対多くの関係のみがサポートされています)
emage画像の代わりに、絵文字をメニューアイテムアイコンとして使用するオプション
☘☘️...そしてもっと!乞うご期待! ❤❤️
???これらのガイドラインに従って、プルリクエストを作成することにより、 Model2Appに自由に貢献してください。
Model2App? Model2Appが使用するアイコンは、FlaticonのLucy Gによって設計されました
領域の背後にあるすべての人々に感謝します
?
? Model2AppはMITライセンスの下で利用できます。詳細については、ライセンスファイルを参照してください。