Model2App é uma biblioteca simples que permite gerar rapidamente um aplicativo CRUD iOS com base em apenas um modelo de dados definido no Swift. ( CRUD - Crie LEIA UPDATE DELETE). Sempre quis validar rapidamente um modelo de dados para o seu próximo aplicativo IOS incrível? Model2App permite economizar horas/dias gerando um aplicativo totalmente funcionando com camada de persistência, validação e muitos outros recursos. Basta definir seu modelo, acertar ⌘ + R e aproveitar seu aplicativo. ?
Model2App usa o reino ❤️ sob o capô e pode ser tratado como sua extensão nas atividades de desenvolvimento, especialmente na fase de definir ou validar um modelo de dados para um projeto maior.
✅ Menu do aplicativo com base em uma lista de classes definidas pelo seu aplicativo
✅ Objetos Lista de visualizações, de acordo com cada classe de modelo
View Dynamic Object View para criar, atualizar e visualizar objetos de uma determinada classe, com base na lista de propriedades do modelo
Cells As células da propriedade do objeto, com base no tipo de propriedade ou no tipo de controle declarado (consulte os tipos de controle suportados abaixo)
✅ Lógica para lidar com diferentes tipos de controle para alterar os valores das propriedades do objeto
✅ Lógica de validação para criar/atualizar objetos usando o conjunto de regras predefinidas ou personalizadas usando um fechamento
✅ Lógica para objetos criados persistentes no armazenamento local ( Realm )
✅ Lógica para invocar a sessão de atualização de objetos e excluir objetos
✅ Lógica para definir relacionamentos entre objetos, no caso de propriedades Object
✅ Seções de objetos relacionados para objetos que são referenciados por outros objetos (relações inversas)
✅ Lógica para criar um objeto relacionado a partir de uma determinada visão de objeto
✅ Lógica para atravessar (infinitamente) entre objetos relacionados
✅ Fora da caixa Zoom-in e zoom-out de animações de navegação
✅ & um monte de muitos outros pequenos recursos
✅ Ajuste o menu do aplicativo (layout, pedido, fundo, ícones/layout/alfas dos itens de menu, nomes/tamanhos/cores de fontes, animações e muito mais)
✅ Escolha qualquer ícone do item de menu do pacote fornecido ( MenuIcons ), forneça o seu próprio ou deixe Model2App escolher um para você
✅ Ajuste as visualizações da lista de objetos (layout/fundo da célula, propriedades de objeto exibidas, layout de imagens, animações e muito mais)
✅ Ajuste as células da propriedade Vista de objeto (layout/fundo celular, nomes/tamanhos/cores de fontes, layout de imagens, espaço reservado e muito mais)
✅ Ajuste os cabeçalhos dos objetos relacionados à vista do objeto (layout/fundo do cabeçalho, nomes/tamanhos/cores de fontes)
✅ Ajuste as visualizações da lista de selecionadores (layout/fundo da célula, nomes/tamanhos/cores de fontes)
✅ Ocultar uma classe específica no menu do aplicativo ou ocultar uma propriedade específica de uma determinada classe da visualização do objeto
✅ Ajuste Configuração de animação padrão: Duração da apresentação/Dispensação, taxa de amortecimento ou velocidade inicial da mola
✅ Especifique se as visualizações de imagem apresentadas nas células devem ser arredondadas ou não
✅ suporta iPhones e iPads
✅ suporta orientações de retrato e paisagem
✅ Valida seu modelo de dados para relacionamentos declarados e tipos de controle declarados para propriedades
✅ Habilita o uso de caractere emoji para o ícone de menu imagem
✅ Flexibilidade e extensibilidade: Além dos parâmetros de configuração definidos na classe M2AConfig , que pode ser substituída, a maioria das classes e métodos usados para recursos do aplicativo principal possui modificador de acesso open , para que você possa personalizar ou estender partes selecionadas da estrutura Model2App em seu aplicativo
✏️ TextField
✏️ NumberField
✏️ FloatDecimalField
✏️ DoubleDecimalField
CurrencyField
✏️ PhoneField
✏️ EmailField
✏️ PasswordField
✏️ URLField
✏️ ZIPField
Switch
✏️ DatePicker
✏️ TimePicker
✏️ DateTimePicker
✏️ TextPicker
✏️ ObjectPicker
✏️ ImagePicker
✅ Xcode 10.1+
✅ Swift 4.2+
Model2App está disponível através de Cocoapods e Cartago.
Para instalar Model2App via Cocoapods, basta adicionar a seguinte linha ao seu PODFILE:
pod 'Model2App'Em seguida, execute o seguinte comando:
$ pod install Para instalar Model2App via Cartago, basta adicionar a seguinte linha ao seu arquivo Cart:
github "Q-Mobile/Model2App" ~> 0.1.0
Em seguida, execute o seguinte comando:
$ carthage update Lembre -se de adicionar todos os arquivos *.framework de Carthage/Build/* ao seu projeto (não apenas Model2App.framework ), além de outras etapas padrão para Cartago
Após a instalação Model2App , basta definir seu modelo de dados subclassificando ModelClass , como no exemplo abaixo ou no exemplo de aplicativo disponível neste repo ( Model2AppTestApp ) e pressione ⌘ + R . (Nota: Modelo de dados de amostra visível abaixo é apenas um pequeno trecho do aplicativo Exemplo, consulte a fonte Model2AppTestApp para um modelo mais estendido)
@ 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 ?
} Se você deseja personalizar a configuração de classe/propriedade padrão, basta substituir algumas ou todas as propriedades do tipo calculado definidas pelo 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 personalizável: ✏️ displayName - Nome da exibição desta classe. Se não for fornecido, inferido do nome da classe
PluralName pluralName - Nome plural desta classe. Usado para nomear a lista de objetos ou itens de menu. Se não for fornecido, <ClassName> - List é usada
✏️ menuIconFileName - Nome do arquivo de imagem usado para o ícone do menu no menu raiz do aplicativo
✏️ menuIconIsFromAppBundle - Especifica se Model2App deve procurar o arquivo de ícone de menu no pacote de aplicativos principal. Se false , o pacote do Model2App será usado
✏️ menuOrder - ORDEM DE MENU ITEM Para esta aula no menu raiz do aplicativo
✏️ propertyConfigurations - Dicionário de configurações de propriedade para esta classe
✏️ inverseRelationships - Lista de relações inversas para esta classe (deve ser definido se houver algum relacionamento para to-one de outras classes e se você quiser apresentar uma seção de objetos relacionados)
✏️ listViewCellProperties - Lista de propriedades usadas na Lista View Cell's para esta classe. Deve conter todas as propriedades especificadas em listViewCellLayoutVisualFormats
✏️ listViewCellLayoutVisualFormats - Lista de formatos visuais para visualizar o layout da célula de visualização, usando a linguagem de formato visual de layout automático da Apple
✏️ isHiddenInRootView - Especifica se uma determinada classe de modelo deve ser oculta no menu raiz do aplicativo (útil no caso de entidades infantis que devem ser exibidas apenas na seção de objetos relacionados, para um determinado objeto)
PropertyConfiguration : ✏️ controlType - Especifica o tipo de controle da interface do usuário usado para esta propriedade
✏️ placeholder - Especifica o valor do espaço reservado usado quando nenhum valor é fornecido para esta propriedade
✏️ pickerValues - Especifica a lista de possíveis valores dos selecionadores para esta propriedade. Válido apenas para TextPicker controltype
✏️ validationRules - Especifica a lista de regras de validação para esta propriedade (avaliada ao criar um novo objeto dessa classe)
✏️ isHidden - Especifica se essa propriedade deve estar escondida na interface do usuário
ValidationRule ): ✏️ Required
✏️ MinLength(length: Int)
✏️ MaxLength(length: Int)
✏️ MinValue(value: Double)
✏️ MaxValue(value: Double)
✏️ Email
✏️ URL
✏️ Custom(isValid: (ModelClass) -> Bool)
A classe M2AConfig define a configuração padrão do aplicativo que pode ser opcionalmente subcllasse pelo aplicativo. Consulte o arquivo M2AConfig Class e AppConfig.swift no aplicativo Model2AppTestApp .
Model2App usa o reino sob o capô, por isso tem considerações semelhantes à definição do modelo:@objc dynamic var (ou apenas dynamic var se a própria classe for declarada usando objcMembers ), exceto a OptionalProperty (usada para números/bool), que deve ser declarada usando apenas let .OptionalProperty (alias para o RealmOptional da Realm). O diretório Model2AppTestApp neste repositório contém um aplicativo de exemplo que define um modelo de dados relacionado ao CRM muito simples. Open Model2AppTestApp/Model2AppTestApp.xcworkspace e execute este aplicativo de teste para ver quais são os efeitos da aplicação da biblioteca Model2App a um modelo de dados de amostra.
0.1.0 do Model2App não lida com as migrações do modelo de dados; portanto, se você alterar seu modelo de dados após o lançamento do aplicativo inicial, receberá um erro e precisará remover o aplicativo, antes do próximo lançamento, para ver o modelo atualizado. O manuseio de migrações de modelos está planejado no roteiro para lançamentos futuros.
OptionalProperty você não pode usar #keyPath para referenciar com segurança uma determinada propriedade (por exemplo, da propertyConfigurations ou da definição listViewCellProperties )
A versão 0.1.0 do Model2App contém um conjunto limitado de recursos. Existem muitas funcionalidades que podem estender seu valor:
☘️ Pesquisando nas visualizações da lista de objetos
☘️ Filtragem nas visualizações da lista de objetos
☘️ Classificação nas visualizações da lista de objetos
☘️ Manipulação de deleções em cascata
☘️ Migrações de modelo de manuseio
☘️ Suporte para o tipo de controle: “Slider”
☘️ Suporte para o tipo de controle: “TextView”
☘️ Suporte para o tipo de controle: “Botão"
☘️ Suporte para relacionamentos um para muitos (até agora apenas relacionamentos inversos de um para muitos são suportados)
☘️ Opção para usar emoji como ícone do item de menu, em vez de imagens
☘️ ... e muito mais! Fique atento! ❤️
??? Sinta -se à vontade para contribuir com Model2App , criando uma solicitação de tração, seguindo estas diretrizes:
Model2App ? Os ícones usados pelo Model2App foram projetados por Lucy G de Flaticon
Agradecimentos especiais a todas as pessoas por trás do reino
? Karol Kulesza (@karolkulesza)
? O Model2App está disponível sob a licença do MIT. Consulte o arquivo de licença para obter mais informações.