Model2App adalah pustaka sederhana yang memungkinkan Anda dengan cepat menghasilkan aplikasi CRUD iOS berdasarkan hanya model data yang ditentukan dalam Swift. ( CRUD - Buat Baca Pembaruan Hapus). Pernah ingin dengan cepat memvalidasi model data untuk aplikasi iOS yang luar biasa berikutnya? Model2App memungkinkan Anda menghemat jam/hari dengan menghasilkan aplikasi yang berfungsi penuh dengan lapisan persistensi, validasi, dan banyak lagi fitur. Tentukan cukup model Anda, tekan ⌘ + R dan nikmati aplikasi Anda. ?
Model2App menggunakan ranah ❤️ di bawah kap dan dapat diperlakukan sebagai perpanjangan dalam kegiatan pengembangan, terutama dalam fase mendefinisikan atau memvalidasi model data untuk proyek yang lebih besar.
✅ menu aplikasi berdasarkan daftar kelas yang ditentukan oleh aplikasi Anda
✅ Tampilan daftar objek, per setiap kelas model
✅ Tampilan Objek Dinamis untuk Membuat, Memperbarui dan Melihat Objek Kelas yang Diceritakan, Berdasarkan Daftar Properti Model
✅ Sel properti objek, berdasarkan jenis properti atau pada jenis kontrol yang dinyatakan (lihat jenis kontrol yang didukung di bawah)
✅ Logika untuk menangani berbagai jenis kontrol untuk mengubah nilai properti objek
✅ Logika validasi untuk membuat/memperbarui objek menggunakan set aturan yang telah ditentukan atau kustom menggunakan penutupan
✅ Logika untuk bertahan objek yang dibuat di penyimpanan lokal ( Realm )
✅ Logika untuk Memanggil Sesi Pembaruan Objek dan Menghapus Objek
✅ Logika untuk mengatur hubungan antar objek, dalam hal properti Object
✅ Bagian objek terkait untuk objek yang dirujuk oleh objek lain (hubungan terbalik)
✅ Logika untuk membuat objek terkait dari tampilan objek yang diberikan
✅ Logika untuk melintasi (tanpa batas) antara objek terkait
✅ di luar kotak zoom-in & zoom-out navigasi animasi
✅ & sekelompok lebih banyak fitur kecil
✅ Sesuaikan menu aplikasi (tata letak, pesanan, latar belakang, ikon/tata letak/alfa, nama font/ukuran/warna, animasi, dan lainnya)
✅ Pilih ikon item menu apa pun dari bundel yang disediakan ( MenuIcons ), berikan sendiri, atau biarkan Model2App memilih satu untuk Anda
✅ Sesuaikan tampilan daftar objek (tata letak/latar belakang sel, properti objek yang ditampilkan, tata letak gambar, animasi dan lainnya)
✅ Sesuaikan Objek Lihat sel properti (tata letak/latar belakang sel, nama/ukuran/warna, tata letak gambar, placeholder dan banyak lagi)
✅ Sesuaikan Objek Tampilan Header Objek Terkait (tata letak header/latar belakang, nama font/ukuran/warna)
✅ Sesuaikan tampilan daftar pemilih (tata letak/latar belakang sel, nama font/ukuran/warna)
✅ Sembunyikan kelas tertentu dari menu aplikasi atau sembunyikan properti tertentu dari kelas yang diberikan dari tampilan objek
✅ Sesuaikan konfigurasi animasi default: durasi animasi presentasi/pemberhentian, rasio redaman atau kecepatan pegas awal
✅ Tentukan apakah tampilan gambar yang disajikan dalam sel harus dibulatkan atau tidak
✅ mendukung iPhone dan iPad
✅ mendukung orientasi potret dan lanskap
✅ Memvalidasi model data Anda untuk hubungan yang dinyatakan dan jenis kontrol yang dinyatakan untuk properti
✅ Mengaktifkan menggunakan karakter emoji untuk gambar ikon menu
✅ Fleksibilitas & ekstensibilitas: Terlepas dari parameter konfigurasi yang ditentukan dalam kelas M2AConfig yang dapat diganti, sebagian besar kelas & metode yang digunakan untuk fitur aplikasi inti memiliki pengubah akses open , sehingga Anda dapat menyesuaikan atau memperluas bagian -bagian yang dipilih dari kerangka Model2App di aplikasi Anda
✏️ TextField
✏️ NumberField
✏️ FloatDecimalField
✏️ DoubleDecimalField
✏️ CurrencyField
✏️ PhoneField
✏️ EmailField
✏️ PasswordField
✏️ URLField
✏️ ZIPField
✏️ Switch
✏️ DatePicker
✏️ TimePicker
✏️ DateTimePicker
✏️ TextPicker
✏️ ObjectPicker
✏️ ImagePicker
✅ Xcode 10.1+
✅ Swift 4.2+
Model2App tersedia melalui Cocoapods dan Carthage.
Untuk menginstal Model2App melalui Cocoapods, cukup tambahkan baris berikut ke podfile Anda:
pod 'Model2App'Kemudian jalankan perintah berikut:
$ pod install Untuk menginstal Model2App melalui Carthage, cukup tambahkan baris berikut ke cartfile Anda:
github "Q-Mobile/Model2App" ~> 0.1.0
Kemudian jalankan perintah berikut:
$ carthage update Harap ingat untuk menambahkan semua file *.framework dari Carthage/Build/* ke proyek Anda (tidak hanya Model2App.framework ), terlepas dari langkah standar lainnya untuk Carthage
Setelah menginstal Model2App , cukup tentukan model data Anda dengan subklassing ModelClass , seperti pada contoh di bawah ini atau seperti pada aplikasi contoh yang tersedia dalam repo ini ( Model2AppTestApp ) dan tekan ⌘ + R . (Catatan: Contoh model data yang terlihat di bawah ini hanyalah kutipan kecil dari aplikasi contoh, silakan merujuk ke sumber Model2AppTestApp untuk model yang lebih diperpanjang)
@ 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 ?
} Jika Anda ingin menyesuaikan konfigurasi kelas/properti default, cukup ganti beberapa atau semua properti tipe yang dihitung yang ditentukan oleh 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 yang Dapat Disesuaikan: ✏️ displayName - Tampilan nama kelas ini. Jika tidak disediakan, disimpulkan dari nama kelas
✏️ pluralName - Nama jamak kelas ini. Digunakan untuk menyebutkan daftar objek atau item menu. Jika tidak disediakan, <ClassName> - List digunakan
✏️ menuIconFileName - nama file gambar yang digunakan untuk ikon menu di root menu aplikasi
✏️ menuIconIsFromAppBundle - Menentukan apakah Model2App harus mencari file ikon menu di bundel aplikasi utama. Jika false , bundel Model2App akan digunakan
✏️ menuOrder - Pesanan item menu untuk kelas ini di root menu aplikasi
✏️ propertyConfigurations - Kamus Konfigurasi Properti untuk Kelas ini
✏️ inverseRelationships - Daftar Hubungan Terbalik untuk Kelas ini (harus didefinisikan jika ada hubungan to-one dari kelas lain dan jika Anda ingin menyajikan bagian dari objek terkait)
✏️ listViewCellProperties - Daftar properti yang digunakan dalam Daftar Tampilan Sel untuk kelas ini. Harus berisi semua properti yang ditentukan dalam listViewCellLayoutVisualFormats
✏️ listViewCellLayoutVisualFormats - Daftar Format Visual untuk Daftar Tampilan Tata Letak Sel, Menggunakan Bahasa Format Visual Tata Letak Otomatis Apple
✏️ isHiddenInRootView - Menentukan apakah kelas model yang diberikan harus disembunyikan di menu root aplikasi (berguna dalam kasus entitas anak yang hanya boleh ditampilkan di bagian objek terkait, untuk objek yang diberikan)
PropertyConfiguration Property Configuration: ✏️ controlType - Menentukan jenis kontrol UI yang digunakan untuk properti ini
✏️ placeholder - Menentukan nilai placeholder yang digunakan saat tidak ada nilai yang disediakan untuk properti ini
✏️ pickerValues - Menentukan daftar nilai pemetik potensial untuk properti ini. Hanya valid untuk TextPicker ControlType
✏️ validationRules - Menentukan daftar aturan validasi untuk properti ini (dievaluasi saat membuat objek baru dari kelas ini)
✏️ isHidden - Menentukan apakah properti ini harus disembunyikan di UI
ValidationRule ): ✏️ Required
✏️ MinLength(length: Int)
✏️ MaxLength(length: Int)
✏️ MinValue(value: Double)
✏️ MaxValue(value: Double)
✏️ Email
✏️ URL
✏️ Custom(isValid: (ModelClass) -> Bool)
Kelas M2AConfig mendefinisikan konfigurasi aplikasi default yang dapat secara opsional disubkilasi oleh aplikasi. Silakan merujuk ke file kelas M2AConfig dan file Contoh AppConfig.swift di Aplikasi Contoh Model2AppTestApp .
Model2App menggunakan ranah di bawah kap, sehingga memiliki pertimbangan yang sama seperti untuk definisi model:@objc dynamic var (atau hanya dynamic var jika kelas itu sendiri dinyatakan menggunakan objcMembers ), kecuali untuk OptionalProperty (digunakan untuk angka/bool), yang harus dinyatakan menggunakan hanya let .OptionalProperty (Alias untuk RealmOptional Realm). Direktori Model2AppTestApp dalam repo ini berisi contoh aplikasi yang mendefinisikan model data terkait CRM yang sangat sederhana. Open Model2AppTestApp/Model2AppTestApp.xcworkspace dan jalankan aplikasi uji ini untuk melihat apa efek dari menerapkan pustaka Model2App ke model data sampel.
0.1.0 dari Model2App tidak menangani migrasi model data, jadi jika Anda mengubah model data Anda setelah peluncuran aplikasi awal, Anda akan mendapatkan kesalahan dan harus menghapus aplikasi, sebelum peluncuran berikutnya, untuk melihat model yang diperbarui. Penanganan migrasi model direncanakan dalam peta jalan untuk rilis di masa mendatang.
OptionalProperty Anda tidak dapat menggunakan #keyPath untuk merujuk dengan aman properti yang diberikan (misalnya dari propertyConfigurations atau Definisi listViewCellProperties )
Versi 0.1.0 dari Model2App berisi serangkaian fitur terbatas. Ada banyak fungsi yang dapat memperpanjang nilainya:
☘️ Mencari tampilan daftar objek
☘️ memfilter tampilan daftar objek
☘️ Menyortir tampilan daftar objek
☘️ menangani penghapusan kaskade
☘️ menangani migrasi model
☘️ Dukungan untuk Jenis Kontrol: “Slider”
☘️ Dukungan untuk Jenis Kontrol: "TextView"
☘️ Dukungan untuk Jenis Kontrol: "Tombol"
☘️ Dukungan untuk hubungan satu-ke-banyak (sejauh ini hanya membalikkan hubungan satu-ke-banyak yang didukung)
☘️ Opsi untuk menggunakan emoji sebagai ikon item menu, bukan gambar
☘️ ... dan banyak lagi! Pantau terus! ❤️
??? Jangan ragu untuk berkontribusi pada Model2App dengan membuat permintaan tarik, mengikuti pedoman ini:
Model2App ? Ikon yang digunakan oleh Model2App dirancang oleh Lucy G dari Flaticon
Terima kasih khusus untuk semua orang di balik ranah
? Karol Kulesza (@karolkulesza)
? Model2App tersedia di bawah lisensi MIT. Lihat file lisensi untuk info lebih lanjut.