본문 바로가기

Programing/My OSS

[Hours] 1.4 update - ComboBox

후처리를 위해 추가한 TextField 대신 Combo Box로 바꾸기로 하였다.

Combo Box

Finder에서 '폴더로 이동'에 보면 최근 사용한 5개의 경로를 최근 사용한 순서대로 보여주는데 이런 구조면 편리하리라 생각했다.

단축키는 cmd+shift+g 이다.

문제점1 - 디센더가 짤린다.

g, j, q 같은 글씨의 아래 부분이 짤리는 문제가 있었다. 타이포그래피에서는 디센더(Descender)라고 부른다.

Size Inspector에서 보니 Height 가 25로 고정이었다. 우선 Control의 Size를 Regular에서 Small 로 바꾸니 글씨가 작아지기는 하는데 짤리는 것은 적어졌다.

글씨가 작아지니 디자인적으로 균형이 맞지 않는 것 같아서 다시 Regular로 복귀하고 속성을 찾아보았다.

Border를 조정하니 괜찮아졌다.

기본적으로 Border는 Bezel로 되어 있는데(세 번째) 두 번째 Line 으로 바꾸니 좀 나아졌다.

기본 Border인 Bezel

아래와 같이 이제 좀 보기가 괜찮아졌다.

기능과 책임

일단 기능은 동일하지만, 다른 내용이 입력되면 최대 5개까지 순서대로 ComboBox 의 아이템(Item)으로 추가를 해야 한다.

또한 추가는 영속 저장이 되어야 프로그램이 종료되고 실행될 때 불러오기(Loading)을 할 수 있을 것이다.

 

책임을 Controller에 추가할 수도 있지만 이런 기능을 하는 새로운 클래스를 만드는 것이 좋겠다는 생각이 들었다.

이름: PostProcessingHistoryManager (Post Processing 이력 관리자)

기능:

 1. 프로그램 로딩시 영속 위치에서 내용을 불러온다. (비어있을 경우 빈 값)

 2. Content 버튼을 눌렀을 때 내용의 추가가 가능하다. (기존 이력에 포함되어 있는 내용일 경우 순서를 제일 최근으로 바꾼다.)

 3. 프로그램 종료시 영속 저장을 수행한다. (매회 하는 방법도 대안)

 

배운 것

swift 의 Array

- array의 조작 방법

- mutaiting 키워드: 원소를 바꾸는 함수는 앞에 붙여주어야 한다. struct에서만 되고 class로 바꾸면 에러가 난다.

- optional을 안전하게 처리하는 방법 관용구: if let value = optionalValue { ... }\

- 문자열 대소문자 미구분 부분일치 찾기 : How to run a case-insensitive search for one string inside another, compare ver (stack overflow)

ComboBox

- 예제: Swift NSCombobox DataSource Sample Code

-- NSComboBoxDataSource

Defaults 사용법

- 예제: iOS ) 왕초보를 위한 User Defaults사용해보기(switch) - iOS를 예로 들었지만 macOS에도 사용이 가능하다.

 

결과

아래 그림처럼 ComboBox로 이전에 수행한 post processing 명령에 대해 선택을 할 수 있게 되었다.

새로운 기능 추가 완료!

해당 코드 수정 PR: https://github.com/namhokim/cocoa_app/pull/12/commits/d19fe3447c583518a321f308705fd7887cebddcd