Model2App - это простая библиотека, которая позволяет быстро генерировать приложение CRUD iOS на основе только модели данных, определенной в Swift. ( CRUD - создать обновление чтения Удалить). Вы когда -нибудь хотели быстро проверить модель данных для вашего следующего удивительного приложения iOS? Model2App позволяет сэкономить часы/дни, генерируя полностью рабочее приложение со слоем постоянства, проверкой и многими другими функциями. Просто определите свою модель, нажмите ⌘ + R и наслаждайтесь вашим приложением. ?
Model2App использует Realm ❤ под капотом и может рассматриваться как расширение в деятельности по разработке, особенно на этапе определения или проверки модели данных для более крупного проекта.
✅ Меню приложения на основе списка классов, определенных вашим приложением
✅ Объекты Список Просмотров по каждому классу модели
✅ Динамическое представление объекта для создания, обновления и просмотра объектов данного класса на основе списка свойств модели
✅ Ячейки свойства объекта, основанные либо на типе свойства, либо на объявленном типе управления (см. Поддерживаемые типы управления ниже)
✅ Логика для обработки различных типов управления для изменения значений свойств объекта
✅ Логика проверки для создания/обновления объектов с использованием набора предопределенных правил или пользовательских, используя закрытие
✅ Логика для постоянных созданных объектов в локальном хранении ( Realm )
✅ Логика для вызывания сеанса обновления объектов и удаления объектов
✅ Логика для установления отношений между объектами, в случае свойств Object
✅ Разделы связанных объектов для объектов, на которые ссылаются другие объекты (обратные отношения)
✅ Логика для создания связанного объекта из данного представления объекта
✅ Логика для прохождения (бесконечно) между родственными объектами
✅ из коробки Zoom-in и увеличения навигационной анимации
✅ и куча из многих других небольших функций
✅ Регулируйте меню приложения (макет, заказ, фон, значки элементов меню/макет/альфа, имена шрифтов/размеры/цвета, анимация и многое другое)
✅ Выберите любой значок элемента меню из предоставленного пакета ( MenuIcons ), предоставить свой собственный или позвольте Model2App выбрать один для вас
✅ Регулировать представления списка объектов (макет ячейки/фон, отображаемые свойства объекта, макет изображений, анимация и многое другое)
✅ Отрегулируйте ячейки свойств объекта (расположение ячейки/фон, имена шрифтов/размеры/цвета, макет изображений, заполнители и многое другое)
✅ Отрегулируйте заголовки объектов объекта (макет заголовка/фон, имена шрифтов/размеры/цвета)
✅ Отрегулируйте представления списка выбора (расположение ячейки/фон, имена шрифтов/размеры/цвета)
✅ Скрыть конкретный класс из меню приложения или скрыть определенное свойство данного класса из объекта.
✅ Регулировать конфигурацию анимации по умолчанию: Продолжительность анимации презентации/увольнения, коэффициент демпфирования или начальная скорость пружины
✅ Укажите, должны ли представления изображений, представленные в ячейках, округлить или нет
✅ поддерживает как iPhone, так и iPad
✅ поддерживает как портретную, так и ландшафтную ориентацию
✅ Проверяет вашу модель данных для объявленных отношений и объявленных типов управления для свойств
✅ позволяет использовать символ Emoji для изображения значка меню
open Гибкость и расширяемость: Помимо параметров конфигурации, определенных в классе M2AConfig , которые можно переопределить, большинство классов и методов, используемых для функций основного Model2App
✏ TextField
✏ NumberField
✏ FloatDecimalField
✏ DoubleDecimalField
✏ CurrencyField
✏ PhoneField
✏ EmailField
✏ PasswordField
✏ URLField
✏ ZIPField
✏ Switch
✏ DatePicker
✏ TimePicker
✏ DateTimePicker
✏ TextPicker
✏ ObjectPicker
✏ ImagePicker
✅ Xcode 10.1+
✅ Swift 4.2+
Model2App доступен как через кокопод, так и Карфаген.
Чтобы установить Model2App через кокопод, просто добавьте следующую строку в свой Podfile:
pod 'Model2App'Затем запустите следующую команду:
$ pod install Чтобы установить Model2App через Карфаген, просто добавьте следующую строку в свой Cartfile:
github "Q-Mobile/Model2App" ~> 0.1.0
Затем запустите следующую команду:
$ carthage update Пожалуйста Model2App.framework не забудьте добавить все *.framework Carthage/Build/*
После установки 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 - указывает, должен ли Model2App искать файл значка меню в основном пакете приложений. Если false , будет использоваться пакет Model2App
✏ menuOrder - Порядок пункта меню для этого класса в корневом меню приложения
✏ propertyConfigurations - Словарь конфигураций свойств для этого класса
✏ inverseRelationships - Список обратных отношений для этого класса (следует определить, если есть to-one отношения из других классов, и если вы хотите представить раздел связанных объектов)
✏ listViewCellProperties - Список свойств, используемых в списке Cell's для этого класса. Должен содержать все свойства, указанные в listViewCellLayoutVisualFormats
✏ listViewCellLayoutVisualFormats - Список визуальных форматов для списка просмотра ячейки с использованием языка визуального формата Apple Auto Mayout
✏ 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 (используется для чисел/лоб), что следует объявить, используя просто let .OptionalProperty (псевдоним для Realm's RealmOptional ). Справочник Model2AppTestApp в этом репо содержит пример приложения, которое определяет очень простую модель данных, связанную с CRM. Open Model2AppTestApp/Model2AppTestApp.xcworkspace и запустите это тестовое приложение, чтобы увидеть, каковы эффекты применения библиотеки Model2App к образце данных данных.
0.1.0 Model2App не обрабатывает миграции модели данных, поэтому, если вы измените свою модель данных после начального запуска приложения, вы получите ошибку и придется удалить приложение, предшествующий следующий запуск, чтобы увидеть обновленную модель. Обработка миграции модели запланирована в дорожной карте для будущих выпусков.
OptionalProperty вы не можете использовать #keyPath для безопасной ссылки на заданное свойство (например, из propertyConfigurations или listViewCellProperties ) определение)
Версия 0.1.0 Model2App содержит ограниченный набор функций. Есть много функциональных возможностей, которые могут расширить его ценность:
☘ Поиск по представлениям списка объектов
☘ Фильтрация в представлениях списка объектов
☘ Сортировка по просмотрам списка объектов
☘ Обработка удаления каскада
☘ Обработка миграции модели
☘ Поддержка для управления типом: «Слайдер»
☘ Поддержка для управления типом: «TextView»
☘ Поддержка для управления типом: «Кнопка»
☘ Поддержка отношений с одним ко многим (пока поддерживается только обратные отношения с одним ко многим)
☘ Вариант использования эмодзи в качестве значка пункта меню вместо изображений
☘ ... и многое другое! Следите за обновлениями! ❤
??? Не стесняйтесь вносить свой вклад в Model2App , создав запрос на тягу, следуя этим рекомендациям:
Model2App ? Значки, используемые Model2App , были разработаны Люси Г из Flaticon
Особая благодарность всем людям, стоящим за царством
? Karol Kulesza (@karolkulesza)
? Model2App доступен по лицензии MIT. Смотрите файл лицензии для получения дополнительной информации.