본문 바로가기
코딩 공부/Swift

[MacOS] 코어데이타 스토리보드 바인딩 예제

by JH-M 2022. 3. 21.

스토리 보드로 UI 디자인과 함께 코어데이타를 바인딩해서 최소한의 코드로 코어데이타를 구현하는 예제 입니다.

 

 

코어데이타 (Core Data)

데이타를 저장하고 관리할 수 있는 기능을 구현하려면 데이타베이스 연동은 필수 입니다. 아이폰 또는 맥용 앱 개발할때 간편하게 코어데이타를 사용할 수 있습니다. 특히 스토리보드 바인딩을 사용해서 최소한의 코드로 데이터베이스 서비스를 구축할 수 있습니다. 코어데이타는 애플의 아이클라우드 기능을 사용 가능하기 때문에 다중기기와 쉽게 연동이 가능합니다. 아이폰과 아이패드, 맥 각각의 앱과 공유하는 데이타베이스를 사용할 수 있다는 이야기 입니다. 단, 다중기기는 연동이 되지만 다중 사용자와 공유할 수 없기 때문에 개인사용자를 위한 데이타베이스로 사용이 제한되어 있습니다.

 

1. Xcode 실행 및 새 프로젝트 생성하기

Xcode 를 실행합니다.

새 프로젝트를 생성하고 템플릿을 선택합니다.

1. 메뉴 FIle → New → Project...
2. macOS → App 선택

 

프로젝트 생성 옵션을 설정합니다.

Product Name: CoreDataTest
Interface: Storyboard
Language: Swift
☑️ Use Core Data 체크

 

2. 코어데이타 모델 생성하기

데이터 모델을 생성합니다.

CoreDataTest 데이타 모델 선택
Add Entity 클릭
➌ 엔티티 이름 Data 로 변경
➍ 속성 추가 클릭
➎ 속성 이름 name, 타입은 String 으로 설정

 

데이타 모델 서브 클래스 파일 생성

Data 엔티티 선택
➋ Codegen: Manual/None
➌ 메뉴 Editor → Create NSManagedObject Subclass.. 선택

 

Next

Next

➍ 서브 클래스 파일 생성 확인

 

3. ViewController 코드추가

ViewController 에 코드를 추가합니다.

➊ ViewController 선택
➋ 아래 코드 둘중 하나를 추가해 줍니다


[코드 1]

@objc let managedObjectContext: NSManagedObjectContext

required init?(coder: NSCoder) {
    self.managedObjectContext = (NSApp.delegate as! AppDelegate).persistentContainer.viewContext
    super.init(coder: coder)
}


[코드 2]

@objc dynamic var managedObjectContext: NSManagedObjectContext!

override func viewDidLoad() {
    super.viewDidLoad()
    self.managedObjectContext = (NSApp.delegate as! AppDelegate).persistentContainer.viewContext
}

 

4. 스토리보드 작업하기

스토리보드 UI 를 추가 합니다.

⓪ 왼쪽 프로젝트 네비게이터에서 Main 선택 (깜빡 했네요^^)
➊ 라이브러리 추가 버튼
➋ TableView 추가
➌ Push Button 추가
➍ Array Controller 추가

라이브러리 추가시 드래그 앤 드롭으로 해당 UI 를 잡아다 끌어서 추가할 수 있습니다

Array Controller 속성 인스펙터 설정

Array Controller 선택
속성 인스펙터 선택
➌ Mode : Entity Name
Entity Name: Data
☑️ Prepares Content 체크

Prepares Content 로 데이타베이스의 데이타를 Arrray Controller 에 자동으로 불러옵니다.

Array Controller 커넥션 인스펙터 설정

Array Controller 선택
커넥션 인스펙터 선택
➌ Control 누른 상태에서 add: 액션 ➕ 버튼으로 드래그 앤 드롭
➍ Control 누른 상태에서 remove: 액션 ➖ 버튼으로 드래그 앤 드롭

 

Array Controller 바인딩 인스펙터 설정

Array Controller 선택
바인딩 인스펙터 선택
☑️ Bind to View Controller
Model Key Path: self.managedObjectContext

모델 키패스의 self.manageObjectContext 는 ViewController 파일에 self.manageObjectContext 와 연결됩니다.

Table View 속성 인스펙터 설정

Table View 선택
➋ Columns: 1

 

Table View Column 바인딩 인스펙터 설정

Table Column 선택
바인딩 인스펙터 선택
☑️ Bind to Array Controller
Controller Key: arrangedObjects

 

Table View Cell 속성 인스펙터 설정

Table View Cell 선택
속성 인스펙터 선택
➌ Behavior: Editable

 

Table View Cell 바인딩 인스펙터 설정

Table View Cell 선택
바인딩 인스펙터 선택
☑️ Bind to Table Cell View
Model Key Path: objectValue.name

 

5. 앱 실행 및 테스트

앱 실행

▶️ 버튼은 실행
◼︎ 버튼은 종료

 

앱 실행 및 테스트

➕ 버튼 : 데이타 추가
➖ 버튼 : 데이타를 삭제

추가된 항목을 더블클릭하면 이름을 수정할 수 있습니다.

 

⚠️ 데이타 저장이 안된다면?

 

앱을 ◼︎정지하고 다시 ▶️실행하면 기존에 추가한 데이타가 저장되지 않고 날라가 버립니다. 메뉴에서 CoreDataTest → Quit CoreDataTest 로 앱을 종료하면 저장은 되지만 앱을 종료하지 않고 명시적으로 저장하는 버튼을 따로 만들어 보겠습니다.


# [예제] 저장버튼 추가하기

데이타 저장하는 메뉴 추가하기

➊ 메뉴 File 클릭
라이브러리 선택
Menu Item 추가
속성 인스펙터 선택
➎ Title: Save Data

 

First Responder 바인딩

First Responder 클릭
바인딩 인스펙터 선택
saveAction: 드래그 드롭 으로 Save Data 메뉴에 바인딩

 

데이타 저장 테스트

1. 앱을 ▶️실행하고 데이타를 추가합니다.
2. 메뉴 → File → Save Data 를 클릭합니다.
3. 앱을 ◼︎종료하고 다시 ▶️실행하면 이전에 추가한 데이타를 확인 할 수 있습니다.

 


# [예제] 엔티티 속성 추가하기

엔티티 속성 추가하기

CoreDataTest 데이타 모델 선택
Data 엔티티 선택
속성 추가 클릭
➍ 속성 이름 point, 타입은 Interger64 로 설정

 

데이타 모델 서브 클래스 파일 업데이트

Data 엔티티 선택
➋ Codegen: Manual/None
➌ 메뉴 Editor → Create NSManagedObject Subclass.. 선택

 

서브 클래스 파일 업데이트 확인

➊ Data+CoreDataProperties 선택
point 변수 추가된것 확인

 

테이블뷰와 라벨 추가하기

Main 스토리보드 선택
Table View 선택
➌ Columns: 2
라이브러리 추가
Label 2개, Pupup Button 1개 추가

 

첫번째 라벨 바인딩

첫번재 라벨 선택
바인딩 인스펙터 선택
☑️ Bind to Array Controller
Controller Key: selection
Model Key Path: name

 

두번째 라벨 바인딩

두번재 라벨 선택
바인딩 인스펙터 선택
☑️ Bind to Array Controller
Controller Key: arrangedObject
Model Key Path: @sum.point

 

팝업 버튼 바인딩

팝업 버튼 선택
바인딩 인스펙터 선택
☑️ Bind to Array Controller
Controller Key: arrangedObject
Model Key Path: name

 

Table Column 바인딩

➊ 추가된 Table Column 선택
바인딩 인스펙터 선택
☑️ Bind to Array Controller
Controller Key: arrangedObjects

 

Table View Cell 바인딩

Table View Cell 선택
바인딩 인스펙터 선택
☑️ Bind to Table Cell View
Model Key Path: objectValue.point

 

Table View Cell 속성 수정하기

Table View Cell 선택
속성 인스펙터 선택
➌ Behavior: Editable

 

Number Formatter 추가

라이브러리 추가
Number Formatter 검색
➌ 표시 위치로 추가

 

Number Formatter 설정

Number Formatter 선택
속성 인스펙터 선택
➌ Style: Decimal

 

앱 실행 및 테스트

첫번째 라벨은 선택된 Data 의 name 을 표시합니다.
두번째 라벨은 모든 Data 의 point 합계를 표시합니다.
팝업 버튼은 테이블과 같이 Data 의 name 리스트를 표시합니다.

테이블에 데이타를 수정하면 실시간으로 바인딩된 라벨과 팝업버튼의 값도 변합니다.


# [예제] 이미지, 바이너리 데이타 속성 추가하기

엔티티 속성 추가

CoreDataTest 데이타 모델 선택
➋ Data → MyData 엔티티 이름 변경
➌ 속성 content 추가, 타입은 Binery Data 설정
속성 image 추가, 타입은 Transformable 설정
➍ 기존 Data+CoreDataClass, Data+CoreDataProperties 파일 삭제
메뉴 Editor → Create NSManagedObject Subclass.. 로 변경된 이름의 Subclass 파일 추가

⚠️ 엔티티 Data 의 이름을 변경하는 이유 : Binery Data 가 Swift 에서 타입 이름이 Data 로 엔티티 이름과 겹치기 문제로 에러가 발생합니다. 그렇기 때문에 엔티티 이름을 MyData 로 변경해 주었습니다.

Array Controller 엔티티 이름 변경

Main 스토리보드 선택
Array Controller 선택
속성 인스펙터 선택
➍ Entity Name: MyData

 

이미지 뷰와 텍스트 뷰 추가하기

Main 스토리보드 선택
라이브러리 추가
Image Well 추가
Scrollable Text View 추가

 

Image Well 속성 수정하기

Image Well 선택
속성 인스펙터 선택
☑️ Editable 체크

 

Image Well 바인딩

Image Well 선택
바인딩 인스펙터 선택
☑️ Bind to Array Controller
Controller Key: selection
Model Key Path: image

 

Text View 속성 수정하기

Text View 선택
속성 인스펙터 선택
☑️ Rich Text 체크

 

Text View 바인딩

Text View 선택
바인딩 인스펙터 선택
☑️ Bind to Array Controller
Controller Key: selection
Model Key Path: content

 

앱 실행 및 테스트

Image Well 에 이미지 파일을 드래그 앤 드롭으로 추가할 수 있습니다.
Text View 에 있는 content 는 일반 텍스트가 아닌 Attributed Text 로 속성을 갖는 특징 때문에 바이너리 데이타 타입으로 저장합니다. Attributed Text텍스트 칼라나 볼드체 등의 표현이 가능합니다.

댓글