Model2App هي مكتبة بسيطة تتيح لك إنشاء تطبيق CRUD iOS بسرعة استنادًا إلى نموذج بيانات محدد في Swift. ( CRUD - إنشاء قراءة تحديث الحذف). هل سبق لي أن أردت التحقق من صحة نموذج بيانات لتطبيق iOS الرائع التالي؟ يتيح لك Model2App توفير ساعات/أيام من خلال إنشاء تطبيق يعمل بالكامل مع طبقة الثبات والتحقق من صحة والعديد من الميزات الأخرى. فقط حدد النموذج الخاص بك ، واضغط على ⌘ + R واستمتع بتطبيقك. ؟
يستخدم Model2App المجال ❤ تحت الغطاء ويمكن التعامل معه كامتداد في أنشطة التطوير ، وخاصة في مرحلة تحديد أو التحقق من صحة نموذج بيانات لمشروع أكبر.
✅ قائمة التطبيق استنادًا إلى قائمة الفئات المحددة بواسطة تطبيقك
✅ طرق عرض قائمة الكائنات ، لكل فئة طراز
✅ عرض الكائن الديناميكي لإنشاء وتحديث وعرض الكائنات لفئة معينة ، استنادًا إلى قائمة خصائص النموذج
✅ خلايا خاصية الكائن ، بناءً على نوع الخاصية أو على نوع التحكم المعلن (انظر أنواع التحكم المدعومة أدناه)
✅ المنطق للتعامل مع أنواع التحكم المختلفة لتغيير قيم خصائص الكائن
✅ منطق التحقق من الصحة لإنشاء/تحديث الكائنات باستخدام مجموعة من القواعد المحددة مسبقًا أو القصة المخصصة باستخدام الإغلاق
✅ منطق استمرار الكائنات التي تم إنشاؤها في التخزين المحلي ( Realm )
✅ منطق لاستدعاء جلسة تحديث الكائن وحذف الكائنات
✅ منطق إعداد العلاقات بين الكائنات ، في حالة خصائص Object
✅ أقسام الكائنات ذات الصلة للكائنات التي تتم الإشارة إليها بواسطة كائنات أخرى (علاقات عكسية)
✅ منطق لإنشاء كائن ذي صلة من عرض كائن معين
✅ المنطق لتجارة (بلا حدود) بين الكائنات ذات الصلة
✅ خارج الصندوق الرسوم المتحركة للتنقل والتكبير
✅ & a حفنة من العديد من الميزات الصغيرة
✅ قم بضبط قائمة التطبيق (التخطيط ، الطلب ، الخلفية ، أيقونات/تخطيط/alphas ، أسماء الخطوط/الأحجام/الألوان ، الرسوم المتحركة والمزيد)
✅ اختر أي رمز عنصر قائمة من الحزمة المقدمة ( MenuIcons ) ، أو توفير خاص بك ، أو دع Model2App اختيار واحد لك
✅ قم بضبط طرق عرض قائمة الكائنات (تخطيط/خلفية الخلايا ، وخصائص الكائن المعروضة ، وتخطيط الصور ، والرسوم المتحركة والمزيد)
✅ ضبط خلايا خاصية عرض الكائن (تخطيط/خلفية الخلايا ، أسماء الخطوط/الأحجام/الألوان ، تخطيط الصور ، أصحاب النائب والمزيد)
✅ ضبط رؤوس الكائنات ذات الصلة الكائنات (تخطيط/خلفية الرأس ، أسماء الخطوط/الأحجام/الألوان)
✅ قم بضبط طرق عرض قائمة المنتقي (تخطيط الخلايا/الخلفية ، أسماء الخطوط/الأحجام/الألوان)
✅ إخفاء فئة معينة من قائمة التطبيق أو إخفاء خاصية محددة لفئة معينة من عرض الكائن
✅ اضبط تكوين الرسوم المتحركة الافتراضية: مدة العرض التقديمي/الفصل ، نسبة التخميد أو سرعة الربيع الأولية
✅ حدد ما إذا كان ينبغي تقريب طرق عرض الصورة المقدمة في الخلايا أم لا
✅ يدعم كل من أجهزة iPhone و iPads
✅ يدعم كل من توجهات الصورة والمناظر الطبيعية
✅ يتحقق من صحة نموذج البيانات الخاص بك للعلاقات المعلنة وأنواع التحكم المعلنة للخصائص
✅ يتيح استخدام حرف الرموز التعبيرية لصورة أيقونة القائمة
✅ المرونة والتوسيع: بصرف النظر عن معلمات التكوين المحددة في فئة M2AConfig والتي يمكن تجاوزها ، فإن معظم الفئات والطرق المستخدمة لميزات التطبيق الأساسية لها معدل وصول open ، بحيث يمكنك تخصيص أو تمديد أجزاء محددة من إطار عمل Model2App في تطبيقك
✏ TextField
✏ NumberField
✏ FloatDecimalField
✏ DoubleDecimalField
CurrencyField
✏ PhoneField
✏ EmailField
✏ PasswordField
ur URLField
✏ ZIPField
Switch
✏ DatePicker
TimePicker
✏ DateTimePicker
✏ TextPicker
✏ ObjectPicker
✏ ImagePicker
✅ xcode 10.1+
✅ سويفت 4.2+
يتوفر Model2App من خلال كل من Cocoapods و Carthage.
من أجل تثبيت Model2App عبر cocoapods ، ما عليك سوى إضافة السطر التالي إلى podfile الخاص بك:
pod 'Model2App'ثم قم بتشغيل الأمر التالي:
$ pod install من أجل تثبيت Model2App عبر قرطاج ، ما عليك سوى إضافة السطر التالي إلى Cartfile:
github "Q-Mobile/Model2App" ~> 0.1.0
ثم قم بتشغيل الأمر التالي:
$ carthage update يرجى تذكر إضافة جميع ملفات *.framework من Carthage/Build/* إلى مشروعك (ليس فقط Model2App.framework ) ، بصرف النظر عن الخطوات القياسية الأخرى ل carthage
بعد تثبيت Model2App ، ما عليك سوى تحديد نموذج البيانات الخاص بك عن طريق ModelClass الفرعي ، كما هو الحال في المثال أدناه أو كما هو الحال في APPOM APP المتوفر في هذا 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 Typezable: ✏ displayName - اسم عرض هذه الفئة. إذا لم يتم توفيره ، استنتج من اسم الفصل
pluralName - الجمع الاسم لهذه الفئة. تستخدم لتسمية قائمة الكائنات أو عناصر القائمة. إذا لم يتم توفيره ، يتم استخدام <ClassName> - List
✏ menuIconFileName - اسم ملف الصورة المستخدم لأيقونة القائمة في قائمة الجذر للتطبيق
✏ menuIconIsFromAppBundle - يحدد ما إذا كان يجب أن يبحث Model2App عن ملف أيقونة القائمة في حزمة التطبيق الرئيسية. إذا كان false ، سيتم استخدام حزمة Model2App
✏ menuOrder - طلب عنصر القائمة لهذا الفئة في قائمة الجذر للتطبيق
✏ propertyConfigurations - قاموس تكوينات الممتلكات لهذه الفئة
✏ inverseRelationships - قائمة العلاقات العكسية لهذا الفئة (يجب تعريفها إذا كانت هناك أي علاقات to-one من فئات أخرى وإذا كنت ترغب في تقديم قسم من الكائنات ذات الصلة)
✏ listViewCellProperties - قائمة الخصائص المستخدمة في قائمة Cell's لهذه الفئة. يجب أن تحتوي على جميع الخصائص المحددة في listViewCellLayoutVisualFormats
✏ listViewCellLayoutVisualFormats - قائمة التنسيقات المرئية لمشاهدة تخطيط خلية عرض القائمة ، باستخدام لغة تنسيق التصميم التلقائي التلقائي من Apple
✏ isHiddenInRootView - يحدد ما إذا كان ينبغي إخفاء فئة نموذج معينة في قائمة الجذر للتطبيق (مفيد في حالة الكيانات الفرعية التي يجب عرضها فقط في قسم الكائنات ذات الصلة ، لكائن معين)
PropertyConfiguration : ✏ controlType - يحدد نوع التحكم في واجهة المستخدم المستخدم لهذه الخاصية
✏ placeholder - يحدد قيمة العنصر النائب المستخدمة عندما لا يتم توفير قيمة لهذه الخاصية
✏ pickerValues - يحدد قائمة قيم منتقي المحتملة لهذه الخاصية. صالح فقط لـ TextPicker ControlType
✏ validationRules - يحدد قائمة قواعد التحقق من صحة هذه الخاصية (تم تقييمها عند إنشاء كائن جديد من هذه الفئة)
✏ isHidden - يحدد ما إذا كان ينبغي إخفاء هذه الخاصية على واجهة المستخدم
ValidationRule ): ✏ Required
✏ MinLength(length: Int)
✏ MaxLength(length: Int)
✏ MinValue(value: Double)
✏ MaxValue(value: Double)
✏ Email
✏ URL
✏ Custom(isValid: (ModelClass) -> Bool)
تحدد فئة M2AConfig تكوين التطبيق الافتراضي الذي يمكن أن يتم اختياريًا من قبل التطبيق. يرجى الرجوع إلى كل من مصدر فئة M2AConfig وملف AppConfig.swift في تطبيق Model2AppTestApp مثال.
Model2App عالم تحت الغطاء ، لذلك يكون له اعتبارات مماثلة لتعريف النموذج:@objc dynamic var (أو فقط dynamic var إذا تم الإعلان عن الفئة نفسها باستخدام objcMembers ) ، باستثناء OptionalProperty (المستخدم للأرقام/BOOL) ، والتي يجب إعلانها باستخدام فقط let .OptionalProperty (الاسم المستعار RealmOptional عالم). يحتوي دليل Model2AppTestApp في هذا الريبو على تطبيق مثال يحدد نموذج بيانات بسيط للغاية يتعلق بـ 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 متاح تحت رخصة معهد ماساتشوستس للتكنولوجيا. انظر ملف الترخيص لمزيد من المعلومات.