Model2App是一個簡單的庫,可讓您快速基於Swift中定義的數據模型生成CRUD iOS應用。 ( CRUD創建讀取更新刪除)。是否曾經想為您的下一個很棒的iOS應用程序快速驗證數據模型嗎? Model2App使您可以通過生成具有持久層,驗證和更多功能的全部工作應用程序來節省小時/天。只需定義您的模型,點擊⌘ + R並享受您的應用。 ?
Model2App在引擎蓋下使用領域❤️,可以將其視為開發活動的擴展,尤其是在定義或驗證大型項目的數據模型的階段。
✅基於應用程序定義的類的應用菜單
✅對象列表視圖,每個模型類
✅基於模型屬性列表,用於創建,更新和查看給定類的對象的動態對象視圖
✅基於屬性類型或已聲明的控制類型的對象屬性單元格(請參閱下面的支持的控制類型)
✅邏輯處理不同的控制類型以更改對象屬性的值
✅使用一組預定義的規則或使用閉合來創建/更新對象的驗證邏輯,以創建/更新對象
✅在本地存儲( Realm )中持續創建的對象的邏輯
✅調用對象更新會話和刪除對象的邏輯
✅在Object屬性的情況下,用於在對象之間設置關係的邏輯
✅針對其他對象引用的對象(逆關係)的對象的部分
✅用於從給定對象視圖創建相關對象的邏輯
✅相關對象之間的邏輯到遍歷(無限)
✅開箱即用縮放和縮放導航動畫
✅&一堆更多的小功能
✅調整應用程序菜單(佈局,訂單,背景,菜單項的圖標/佈局/alphan,字體名稱/尺寸/顏色,動畫等)
✅從提供的捆綁包( MenuIcons )中選擇任何菜單項圖標,提供您自己的菜單,或者讓Model2App為您選擇一個
✅調整對象列表視圖(單元格佈局/背景,顯示的對象屬性,圖像佈局,動畫等)
✅調整對象視圖屬性單元格(單元格佈局/背景,字體名稱/尺寸/顏色,圖像佈局,佔位符等)
✅調整對象視圖相關對象的標頭(標題佈局/背景,字體名稱/尺寸/顏色)
✅調整選擇器列表視圖(單元格佈局/背景,字體名稱/尺寸/顏色)
✅從應用菜單中隱藏特定類或從對象視圖隱藏給定類的特定屬性
✅調整默認動畫配置:演示/解僱動畫持續時間,阻尼比或初始彈簧速度
✅指定是否應圓形列出圖像視圖
✅支持iPhone和iPad
✅支持肖像和景觀取向
✅驗證您的數據模型的聲明關係並聲明了屬性的控制類型
✅啟用使用表情符號字符作為菜單圖標圖像
✅靈活性和可擴展性:除了可以覆蓋的M2AConfig類中定義的配置參數外,用於核心應用程序功能的大多數類和方法都具有open訪問修飾符,因此您可以在應用程序中自定義或擴展Model2App框架的選定部分
TextField
✏️ NumberField
FloatDecimalField
✏️ DoubleDecimalField
✏️ CurrencyField
✏️ PhoneField
EmailField
✏️ PasswordField
URLField
ZIPField
✏️ Switch
DatePicker
✏️ TimePicker
DateTimePicker
TextPicker
✏️ ObjectPicker
ImagePicker
✅xcode 10.1+
✅快速4.2+
Model2App可通過可可錄和迦太基提供。
為了通過Cocoapods安裝Model2App ,只需將以下行添加到您的podfile:
pod 'Model2App'然後運行以下命令:
$ pod install為了通過迦太基安裝Model2App ,只需將以下行添加到您的Cartfile:
github "Q-Mobile/Model2App" ~> 0.1.0
然後運行以下命令:
$ carthage update請記住Carthage/Build/*除了迦太基*.framework其他標準步驟Model2App.framework
安裝Model2App之後,只需通過子類ModelClass來定義數據模型,如下所示,或如下示例應用程序中可用的示例應用程序( Model2AppTestApp )中可用,然後點擊⌘ + 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 fromappBundle-指定Model2App是否應該在主應用程序捆綁包中查找菜單圖標文件。如果是false ,則使用Model2App的捆綁包
✏️ menuOrder訂單 - 該類的菜單項在應用程序的根菜單中propertyConfigurations此類屬性配置字典
✏️ inverseRelationships - 此類的反關係列表(如果有其他類別的to-one ,則應定義,如果您想提出相關對象的一部分)
listViewCellProperties此類列表查看單元格中使用的屬性列表。應包含listViewCellLayoutVisualFormats中指定的所有屬性listViewCellLayoutVisualFormats使用Apple的自動佈局視覺格式語言列表查看單元格的視覺格式列表isHiddenInRootView指定給定模型類是否應隱藏在應用程序的根菜單中(對於僅應在相關對象部分顯示的兒童實體,對於給定的對像有用)
PropertyConfiguration的屬性: controlType指定用於此屬性的UI控件的類型
✏️ placeholder - 指定該屬性未提供值時使用的佔位符值pickerValues指定此屬性的潛在選擇器值列表。僅適用於TextPicker contryType
✏️ validationRules - 指定此屬性的驗證規則列表(創建此類的新對象時進行評估)
✏️is isHidden指定該屬性是否應隱藏在UI上
ValidationRule ): Required
✏️ MinLength(length: Int)
✏️ MaxLength(length: Int)
✏️Minvalue MinValue(value: Double)
MaxValue(value: Double)
✏️ Email
URL
Custom(isValid: (ModelClass) -> Bool)
M2AConfig類定義了可以由應用程序選擇的默認應用程序配置。請參閱Model2AppTestApp示例應用中的M2AConfig類源和AppConfig.swift文件。
Model2App在引擎蓋下使用領域,因此它具有與模型定義相似的考慮:@objc dynamic var (或使用objcMembers聲明類本身,只是dynamic var ),除了OptionalProperty Property(用於數字/BOOL)外,應僅使用fer let聲明。OptionalProperty (領域RealmOptional的別名)完成的。 此存儲庫中的Model2AppTestApp目錄包含一個示例應用程序,該應用程序定義了非常簡單的CRM相關數據模型。 Open Model2AppTestApp/Model2AppTestApp.xcworkspace並運行此測試應用程序,以查看將Model2App庫應用於示例數據模型的影響。
Model2App的0.1.0版本未處理數據模型遷移,因此,如果您在初始應用程序啟動後更改數據模型,您將獲得錯誤,並且必須在下一個啟動之前刪除該應用程序,以查看更新的模型。處理模型遷移是在路線圖中計劃的,以備將來發行。
OptionalProperty Property屬性,則不能使用#keyPath安全引用給定屬性(例如,來自propertyConfigurations或listViewCellProperties定義)
Model2App的0.1.0版包含一組有限的功能。有許多功能可以擴展其價值:
☘️在對象列表視圖上搜索
☘️過濾對象列表視圖
☘️在對象列表視圖上排序
☘️處理級聯刪除
☘️處理模型遷移
☘️支持控制類型:“滑塊”
☘️支持控制類型:“ TextView”
☘️支持控制類型:“按鈕”
☘️支持一對多關係(到目前為止,僅支持一對多關係)
☘️選項使用表情符號作為菜單項圖標,而不是圖像
☘️...等等!敬請關注! ❤️
???遵循以下準則,可以隨意通過創建拉動請求來為Model2App做出貢獻:
Model2App? Model2App使用的圖標是由Flaticon的Lucy G設計的
特別感謝領域背後的所有人
? karol kulesza(@karolkulesza)
? Model2App可根據MIT許可獲得。有關更多信息,請參見許可證文件。