Model2App เป็นไลบรารีง่าย ๆ ที่ให้คุณสร้างแอพ CRUD iOS ได้อย่างรวดเร็วตามแบบจำลองข้อมูลที่กำหนดไว้ใน Swift ( CRUD - สร้าง Read Update DELETE) เคยต้องการตรวจสอบรูปแบบข้อมูลสำหรับแอพ iOS ที่ยอดเยี่ยมของคุณอย่างรวดเร็วหรือไม่? Model2App ช่วยให้คุณประหยัดชั่วโมง/วันโดยการสร้างแอพที่ทำงานได้อย่างเต็มที่ด้วยเลเยอร์การคงอยู่การตรวจสอบและคุณสมบัติอื่น ๆ อีกมากมาย เพียงกำหนดโมเดลของคุณกด ⌘ + R และเพลิดเพลินกับแอพของคุณ -
Model2App ใช้ Realm ❤ภายใต้ประทุนและสามารถถือว่าเป็นส่วนขยายในกิจกรรมการพัฒนาโดยเฉพาะอย่างยิ่งในขั้นตอนของการกำหนดหรือตรวจสอบรูปแบบข้อมูลสำหรับโครงการที่ใหญ่กว่า
✅เมนูแอพตามรายการคลาสที่กำหนดโดยแอปของคุณ
✅มุมมองรายการวัตถุตามแต่ละคลาสโมเดล
✅มุมมองวัตถุแบบไดนามิกสำหรับการสร้างอัปเดตและดูวัตถุของคลาสที่กำหนดตามรายการคุณสมบัติของโมเดล
✅เซลล์คุณสมบัติวัตถุขึ้นอยู่กับประเภทคุณสมบัติหรือประเภทควบคุมที่ประกาศ (ดูประเภทการควบคุมที่รองรับด้านล่าง)
✅ตรรกะเพื่อจัดการประเภทการควบคุมที่แตกต่างกันเพื่อเปลี่ยนค่าของคุณสมบัติของวัตถุ
✅ตรรกะการตรวจสอบความถูกต้องสำหรับการสร้าง/อัปเดตวัตถุโดยใช้ชุดของกฎที่กำหนดไว้ล่วงหน้าหรือกำหนดเองโดยใช้การปิด
✅ตรรกะสำหรับการคงที่วัตถุที่สร้างขึ้นในพื้นที่จัดเก็บในท้องถิ่น ( Realm )
✅ตรรกะสำหรับการเรียกใช้เซสชันการอัปเดตวัตถุและการลบวัตถุ
✅ตรรกะสำหรับการตั้งค่าความสัมพันธ์ระหว่างวัตถุในกรณีของคุณสมบัติ Object
✅ส่วนวัตถุที่เกี่ยวข้องสำหรับวัตถุที่อ้างอิงโดยวัตถุอื่น (ความสัมพันธ์แบบผกผัน)
✅ตรรกะสำหรับการสร้างวัตถุที่เกี่ยวข้องจากมุมมองวัตถุที่กำหนด
✅ตรรกะเพื่อสำรวจ (ไม่ จำกัด ) ระหว่างวัตถุที่เกี่ยวข้อง
an Animations การนำทางนำทางจาก Box Zoom-In & Zoom-Out
✅ & พวงคุณสมบัติเล็ก ๆ มากมาย
✅ปรับเมนูแอพ (เค้าโครง, คำสั่ง, พื้นหลัง, ไอคอนรายการเมนู/เลย์เอาต์/อัลฟา, ชื่อตัวอักษร/ขนาด/สี, ภาพเคลื่อนไหวและอื่น ๆ )
✅เลือกไอคอนรายการ Model2App ใด ๆ จากชุด MenuIcons ที่ให้มา
✅ปรับมุมมองรายการวัตถุ (เค้าโครง/พื้นหลังของเซลล์, คุณสมบัติของวัตถุที่แสดง, เค้าโครงรูปภาพ, ภาพเคลื่อนไหวและอื่น ๆ )
✅ปรับวัตถุมุมมองวัตถุเซลล์ (เค้าโครง/พื้นหลังของเซลล์ชื่อตัวอักษร/ขนาด/สีเค้าโครงภาพสถานที่และอื่น ๆ )
✅ปรับส่วนหัวของวัตถุที่เกี่ยวข้องกับวัตถุ (เค้าโครงส่วนหัว/พื้นหลังชื่อตัวอักษร/ขนาด/สี)
✅ปรับมุมมองรายการตัวเลือก (เค้าโครงเซลล์/พื้นหลังชื่อตัวอักษร/ขนาด/สี)
✅ซ่อนคลาสเฉพาะจากเมนูแอพหรือซ่อนคุณสมบัติเฉพาะของคลาสที่กำหนดจากมุมมองวัตถุ
✅ปรับการกำหนดค่าภาพเคลื่อนไหวเริ่มต้น: การนำเสนอ/การปลดออกระยะเวลาการเคลื่อนไหวอัตราส่วนการทำให้หมาด ๆ หรือความเร็วสปริงเริ่มต้น
✅ระบุว่ามุมมองภาพที่นำเสนอในเซลล์ควรโค้งมนหรือไม่
✅รองรับทั้ง iPhone และ iPads
✅สนับสนุนทั้งแนวตั้งและแนวนอน
✅ตรวจสอบรูปแบบข้อมูลของคุณสำหรับความสัมพันธ์ที่ประกาศและประกาศประเภทการควบคุมสำหรับคุณสมบัติ
✅เปิดใช้งานการใช้อักขระอิโมจิสำหรับภาพไอคอนเมนู
✅ความยืดหยุ่นและความยืดหยุ่น: นอกเหนือจากพารามิเตอร์การกำหนดค่าที่กำหนดไว้ในคลาส M2AConfig ซึ่งสามารถแทนที่ได้แล้วคลาสและวิธีการส่วนใหญ่ที่ใช้สำหรับคุณสมบัติแอพหลักมีตัวดัดแปลงการเข้าถึง open ดังนั้นคุณสามารถปรับแต่งหรือขยายส่วนที่เลือกของเฟรมเวิร์ก Model2App ในแอปของคุณ
✏ TextField
✏ NumberField
✏ FloatDecimalField
✏ DoubleDecimalField
✏ CurrencyField
✏ PhoneField
✏ EmailField
✏ PasswordField
✏ URLField
✏ ZIPField
✏ Switch
✏ DatePicker
TimePicker
✏ DateTimePicker
✏ TextPicker
✏ ObjectPicker
imag ImagePicker
✅ xcode 10.1+
✅ Swift 4.2+
Model2App มีให้บริการผ่านทั้ง Cocoapods และ Carthage
ในการติดตั้ง Model2App ผ่าน Cocoapods เพียงเพิ่มบรรทัดต่อไปนี้ลงใน PodFile ของคุณ:
pod 'Model2App'จากนั้นเรียกใช้คำสั่งต่อไปนี้:
$ pod install ในการติดตั้ง Model2App ผ่าน Carthage เพียงเพิ่มบรรทัดต่อไปนี้ลงใน CartFile ของคุณ:
github "Q-Mobile/Model2App" ~> 0.1.0
จากนั้นเรียกใช้คำสั่งต่อไปนี้:
$ carthage update โปรดอย่าลืมเพิ่มไฟล์ *.framework ทั้งหมดจาก Carthage/Build/* ไปยังโครงการของคุณ (ไม่เพียง แต่ Model2App.framework ) นอกเหนือจากขั้นตอนมาตรฐานอื่น ๆ สำหรับ Carthage
หลังจากติดตั้ง Model2App เพียงกำหนดรูปแบบข้อมูลของคุณโดย subclassing ModelClass ดังตัวอย่างด้านล่างหรือในตัวอย่างแอพตัวอย่างที่มีอยู่ใน repo นี้ ( 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 - ระบุว่า Model2App ควรค้นหาไฟล์ไอคอนเมนูในชุดแอพหลักหรือไม่ หากจะใช้ชุด false ของ Model2App
✏ menuOrder - ลำดับรายการเมนูสำหรับคลาสนี้ในเมนูรูทของแอพ
✏ propertyConfigurations - พจนานุกรมการกำหนดค่าคุณสมบัติสำหรับคลาสนี้
✏ inverseRelationships - รายการความสัมพันธ์แบบผกผันสำหรับคลาสนี้ (ควรกำหนดหากมีความสัมพันธ์ to-one จากชั้นเรียนอื่น ๆ และหากคุณต้องการนำเสนอส่วนของวัตถุที่เกี่ยวข้อง)
✏ listViewCellProperties - รายการคุณสมบัติที่ใช้ในรายการมุมมองรายการสำหรับคลาสนี้ ควรมีคุณสมบัติทั้งหมดที่ระบุใน listViewCellLayoutVisualFormats
✏ listViewCellLayoutVisualFormats - รายการรูปแบบภาพสำหรับการจัดวางมุมมองรายการของรายการโดยใช้ภาษารูปแบบภาพอัตโนมัติของ Apple ของ Apple
✏ isHiddenInRootView - ระบุว่าควรซ่อนคลาสโมเดลที่กำหนดไว้ในเมนูรูทของแอพ (มีประโยชน์ในกรณีของเอนทิตีเด็กที่ควรแสดงในส่วนวัตถุที่เกี่ยวข้องสำหรับวัตถุที่กำหนด)
PropertyConfiguration : ✏ controlType - ระบุประเภทของการควบคุม UI ที่ใช้สำหรับคุณสมบัตินี้
✏ placeholder - ระบุมูลค่าตัวยึดตำแหน่งที่ใช้เมื่อไม่มีมูลค่าสำหรับคุณสมบัตินี้
✏ pickerValues - ระบุรายการของค่าตัวเลือกที่เป็นไปได้สำหรับคุณสมบัตินี้ ใช้ได้เฉพาะสำหรับ TextPicker controltype
✏ validationRules - ระบุรายการกฎการตรวจสอบความถูกต้องสำหรับคุณสมบัตินี้ (ประเมินเมื่อสร้างวัตถุใหม่ของคลาสนี้)
✏ isHidden - ระบุว่าควรซ่อนคุณสมบัตินี้ไว้ใน UI
ValidationRule ): ✏ Required
✏ MinLength(length: Int)
✏ MaxLength(length: Int)
✏ MinValue(value: Double)
✏ MaxValue(value: Double)
✏ Email
✏ URL
✏ Custom(isValid: (ModelClass) -> Bool)
คลาส M2AConfig กำหนดการกำหนดค่าแอปเริ่มต้นที่สามารถเลือก subclassed โดยแอป โปรดดูที่ทั้งแหล่งคลาส M2AConfig และไฟล์ AppConfig.swift ในแอปตัวอย่าง Model2AppTestApp
Model2App ใช้อาณาจักรภายใต้ประทุนดังนั้นจึงมีข้อควรพิจารณาที่คล้ายกันสำหรับคำจำกัดความของรุ่น:@objc dynamic var (หรือเพียงแค่ dynamic var ถ้าคลาสนั้นถูกประกาศโดยใช้ objcMembers ) ยกเว้น OptionalProperty (ใช้สำหรับตัวเลข/บูล) ซึ่งควรประกาศโดย letOptionalProperty (นามแฝงสำหรับ RealmOptional ของ Realm) ไดเรกทอรี Model2AppTestApp ใน repo นี้มีแอพตัวอย่างที่กำหนดรูปแบบข้อมูลที่เกี่ยวข้องกับ CRM ที่ง่ายมาก Open Model2AppTestApp/Model2AppTestApp.xcworkspace และเรียกใช้แอพทดสอบนี้เพื่อดูว่าผลกระทบของการใช้ไลบรารี Model2App คืออะไรกับโมเดลข้อมูลตัวอย่าง
0.1.0 ของ Model2App ไม่จัดการกับการย้ายข้อมูลแบบจำลองข้อมูลดังนั้นหากคุณเปลี่ยนโมเดลข้อมูลของคุณหลังจากการเปิดตัวแอปเริ่มต้นคุณจะได้รับข้อผิดพลาดและจะต้องลบแอปก่อนการเปิดตัวครั้งต่อไปเพื่อดูโมเดลที่อัปเดต การจัดการรูปแบบการย้ายข้อมูลมีการวางแผนในแผนงานสำหรับการเผยแพร่ในอนาคต
OptionalProperty คุณไม่สามารถใช้ #keyPath เพื่ออ้างอิงคุณสมบัติที่กำหนดได้อย่างปลอดภัย (เช่นจาก propertyConfigurations หรือ listViewCellProperties )
เวอร์ชัน 0.1.0 ของ Model2App มีชุดคุณสมบัติที่ จำกัด มีฟังก์ชั่นมากมายที่สามารถขยายมูลค่า:
☘ค้นหามุมมองรายการวัตถุ
☘การกรองในมุมมองรายการวัตถุ
☘เรียงลำดับในมุมมองรายการวัตถุ
☘การจัดการการลบคาสเคด
☘การจัดการการย้ายโมเดล
☘รองรับประเภทการควบคุม:“ ตัวเลื่อน”
☘สนับสนุนประเภทการควบคุม:“ TextView”
☘รองรับประเภทการควบคุม:“ ปุ่ม”
☘การสนับสนุนสำหรับความสัมพันธ์แบบหนึ่งต่อหลาย ๆ
☘ตัวเลือกในการใช้อิโมจิเป็นไอคอนรายการเมนูแทนภาพ
☘ ... และอีกมากมาย! คอยติดตาม!
??? อย่าลังเลที่จะมีส่วนร่วมใน Model2App โดยการสร้างคำขอดึงตามแนวทางเหล่านี้:
Model2App - ไอคอนที่ใช้โดย Model2App ได้รับการออกแบบโดย Lucy G จาก Flaticon
ขอขอบคุณเป็นพิเศษสำหรับทุกคนที่อยู่เบื้องหลังอาณาจักร
? Karol Kulesza (@karolkulesza)
- Model2App สามารถใช้ได้ภายใต้ใบอนุญาต MIT ดูไฟล์ใบอนุญาตสำหรับข้อมูลเพิ่มเติม