Model2App SWIFT에 정의 된 데이터 모델만으로 CRUD IOS 앱을 빠르게 생성 할 수있는 간단한 라이브러리입니다. ( CRUD 읽기 업데이트 삭제 생성). 다음 멋진 iOS 앱의 데이터 모델을 빠르게 검증하고 싶었던 적이 있습니까? Model2App 사용하면 지속성 계층, 검증 및 더 많은 기능을 갖춘 완전히 작동하는 앱을 생성하여 시간/일을 절약 할 수 있습니다. 모델을 정의하고 ⌘ + R 누르고 앱을 즐기십시오. ?
Model2App 후드 아래에서 Realm uses️을 사용하며 특히 더 큰 프로젝트를위한 데이터 모델을 정의하거나 검증하는 단계에서 개발 활동의 확장으로 취급 될 수 있습니다.
앱 앱에서 정의한 클래스 목록을 기반으로 앱 메뉴
✅ 객체는 각 모델 클래스별로 목록 뷰입니다
✅ 모델 속성 목록을 기반으로 주어진 클래스의 개체를 작성, 업데이트 및보기위한 동적 객체보기
property 속성 유형 또는 선언 된 제어 유형을 기준으로 객체 속성 셀 (아래 지원 제어 유형 참조)
hogic 객체 속성의 값을 변경하기 위해 다른 제어 유형을 처리하는 논리
✅ 사전 정의 된 규칙 세트를 사용하여 개체 생성/업데이트를위한 유효성 검사 로직 또는 클로저를 사용하여 사용자 정의
✅ 로컬 스토리지에서 생성 된 개체를 지속시키는 논리 ( Realm )
✅ 객체 업데이트 세션을 호출하고 개체 삭제를위한 논리
Object 속성의 경우 객체 간의 관계를 설정하기위한 논리
✅ 다른 객체가 참조하는 객체에 대한 관련 객체의 섹션 (역 관계)
✅ 주어진 개체보기에서 관련 객체 생성을위한 논리
✅ 관련 객체 사이의 트래버스 (무한) 로직
hob 상자에서 Zoom-In 및 확대 / 축소 내비게이션 애니메이션
더 많은 작은 기능들
앱 조정 앱 메뉴 (레이아웃, 순서, 배경, 메뉴 항목의 아이콘/레이아웃/알파, 글꼴 이름/크기/색상, 애니메이션 등)
✅ 제공된 번들 ( MenuIcons )에서 메뉴 항목 아이콘을 선택하거나 직접 제공하거나 Model2App 선택하십시오.
✅ 객체 조정 목록보기 (셀 레이아웃/배경, 표시된 객체 속성, 이미지 레이아웃, 애니메이션 등)
✅ 객체보기 속성 셀 조정 (셀 레이아웃/배경, 글꼴 이름/크기/색상, 이미지 레이아웃, 자리 표시 자 등)
✅ 객체보기 관련 객체의 헤더 조정 (헤더 레이아웃/배경, 글꼴 이름/크기/색상)
picker 목록보기 조정 (셀 레이아웃/배경, 글꼴 이름/크기/색상)
apt 앱 메뉴에서 특정 클래스를 숨기거나 객체보기에서 주어진 클래스의 특정 속성을 숨 깁니다.
✅ 기본 애니메이션 구성 조정 : 프레젠테이션/해고 애니메이션 지속 시간, 감쇠 비율 또는 초기 스프링 속도
셀에 제시된 이미지보기가 반올림 여부 여부를 지정합니다.
∎ iPhone과 iPad를 모두 지원합니다
✅ 초상화와 조경 방향을 모두 지원합니다
✅ 선언 된 관계 및 속성에 대한 선언 된 제어 유형에 대한 데이터 모델을 확인합니다.
menu 메뉴 아이콘 이미지에 이모티콘 문자를 사용할 수 있습니다
✅ 유연성 및 확장 성 : M2AConfig 클래스에 정의 된 구성 매개 변수와는 별도로 핵심 앱 기능에 사용되는 대부분의 클래스 및 메소드에는 open Access 수정자가 있으므로 APP에서 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 Cocoapods와 Carthage를 통해 사용할 수 있습니다.
Cocoapods를 통해 Model2App 설치하려면 PodFile에 다음 줄을 추가하십시오.
pod 'Model2App'그런 다음 다음 명령을 실행합니다.
$ pod install Carthage를 통해 Model2App 설치하려면 다음 줄을 Cartfile에 추가하십시오.
github "Q-Mobile/Model2App" ~> 0.1.0
그런 다음 다음 명령을 실행합니다.
$ carthage update Carthage/Build/* 의 모든 *.framework 파일을 프로젝트 ( Model2App.framework 뿐만 아니라)에 추가하여 Carthage의 다른 표준 단계를 제외하고하십시오.
Model2App 설치 한 후 아래 예제에서와 같이 또는이 Repo ( Model2AppTestApp )에서 사용 가능한 예제 앱에서와 같이 ModelClass 서브 클래싱으로 데이터 모델을 정의하고 ⌘ + 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 에 지정된 모든 속성을 포함해야합니다
Apple의 자동 레이아웃 시각적 형식 언어를 사용하는 listViewCellLayoutVisualFormats 목록보기 셀 레이아웃 목록 셀 레이아웃 목록
✏️ 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 클래스는 앱에서 선택적으로 하위 분류 할 수있는 기본 앱 구성을 정의합니다. Model2AppTestApp 예제 앱에서 M2AConfig 클래스 소스와 AppConfig.swift 파일을 참조하십시오.
Model2App 후드 아래에서 영역을 사용하므로 모델 정의와 비슷한 고려 사항이 있습니다.OptionalProperty (숫자/bool에 사용)를 제외하고 @objc dynamic var dynamic var 또는 클래스 자체가 objcMembers 사용하여 선언되는 경우 동적 let )로 선언해야합니다.OptionalProperty (Realm 's RealmOptional 의 별칭)를 사용하여 수행됩니다. 이 Repo의 Model2AppTestApp 디렉토리에는 매우 간단한 CRM 관련 데이터 모델을 정의하는 예제 앱이 포함되어 있습니다. Model2AppTestApp/Model2AppTestApp.xcworkspace 열고이 테스트 앱을 실행하여 Model2App 라이브러리를 샘플 데이터 모델에 적용하는 효과가 무엇인지 확인하십시오.
Model2App 의 버전 0.1.0 데이터 모델 마이그레이션을 처리하지 않으므로 초기 앱을 시작한 후 데이터 모델을 변경하면 오류가 발생하여 업데이트 된 모델을보기 위해 다음 출시 전에 앱을 제거해야합니다. 미래의 릴리스를 위해 로드맵에서 모델 마이그레이션 처리가 계획됩니다.
OptionalProperty 속성의 경우 #keyPath 사용하여 주어진 속성을 안전하게 참조 할 수 없습니다 (예 : propertyConfigurations 또는 listViewCellProperties 정의).
Model2App 의 버전 0.1.0 에는 제한된 기능 세트가 포함되어 있습니다. 가치를 확장 할 수있는 많은 기능이 있습니다.
☘️ 객체 목록보기에서 검색합니다
객체 목록보기에서 필터링
☘️ 객체 목록보기에서 정렬
cascade 삭제 처리
☘️ 모델 마이그레이션 처리
Control 유형에 대한 지원 : "슬라이더"
Control 유형에 대한 지원 : "TextView"
Control 유형에 대한 지원 : "버튼"
☘️ 일대일 관계에 대한 지원 (지금까지는 역시 일대일 관계 만 지원됩니다)
☘️ 이미지 대신 메뉴 항목 아이콘으로 이모티콘을 사용하는 옵션
☘️ ... 그리고 더 많은! 계속 지켜봐! ❤️
??인? 다음 지침에 따라 풀 요청을 만들어 Model2App 에 자유롭게 기여하십시오.
Model2App ? Model2App 에서 사용하는 아이콘은 Flaticon의 Lucy G에 의해 설계되었습니다.
영역 뒤에있는 모든 사람들에게 특별한 감사를드립니다
? ul Karol Kulesza (@karolkulesza)
? MIT 라이센스에 따라 Model2App을 사용할 수 있습니다. 자세한 내용은 라이센스 파일을 참조하십시오.