콘텐츠로 건너뛰기
Home » 코코아

코코아

코코아 앱 따라하기 – 3

지난 시간까지 macOS용 TTS앱을 간단하게 구현하고, 현재 상태에 따라 UI를 업데이트하도록 다듬고, 테이블 뷰를 사용하는 등의 기본적인 앱 구현에 관한 내용을 살펴보았다. 인터페이스 빌더와 코드 편집기를 오가며 앱을 만드는 방법에 있어서 macOS앱이나 iOS앱은 큰 차이가 없는 듯 보였다. 이번 시간에는 macOS용 앱을 만들 때만 사용 가능한 코코아 바인딩이라는 기술을 통해서 이 앱을 처음부터 새로 작성하는 과정을 살펴볼 것이다.더 보기 »코코아 앱 따라하기 – 3

NSPersistentContainer를 통한 코어데이터 스택생성하기

macOS Sierra로 업데이트되면서 코어데이터에 NSPersistentContainer 클래스가 추가되었다. 이 클래스를 사용하면 코어데이터 스택을 셋업하는 여러 귀찮은 과정을 생략하고 간단하게 처리할 수 있다. 사실 코어데이터 스택을 수동으로 셋업하는 과정에서 필요한 정보는 코어데이터 모델 파일의 이름과, 저장소 파일을 생성할 위치 정도이며, 그외의 대부분의 코드는 보일러 플레이트라 할 수 있다.  저장소 파일 위치는 적당한이름(?)으로 사용자 라이브러리 내에 만들어지므로 결국 최소한으로 필요한 정보는 데이터 모델 파일 이름이 된다. 즉 관리 객체 모델의 이름만 있다면 코어데이터 스택의 초기화에 필요한 코드는 사실상 동일하다 하겠다.

더 보기 »NSPersistentContainer를 통한 코어데이터 스택생성하기
Pages: 1 2

코코아 바인딩의 기초

MVC 패턴에서 프로그래머가 가장 많이 작성하는 코드는 크게 두 가지인데, 하나는 모델 데이터에서 발생한 변경을 뷰에 반영하는 것이고, 다른 하나는 뷰에서 사용자의 조작에 의해서 변경된 값을 모델 데이터에 반영하는 것이다. 사실 이것이 MVC에서 컨트롤러가 수행하는 일이다. GUI프로그램을 작성할 때 가장 많이 하게되는 이러한 작업을 조금 더 간단하게 (가급적이면 코드를 작성하지 않고) 구현하는 방법이 있으면 제법 편하지 않을까? 이럴 때 사용하는 코코아 바인딩은 Cocoa에서 macOS에서 데이터 모델과 뷰 사이의 양방향 연결을 만드는 일종의 ‘마법’이다. 예를 들어 아래 그림과 같은 간단한 앱을… 더 보기 »코코아 바인딩의 기초

트랙킹 캔버스 뷰 만들기 (Cocoa)

예전에 코어 그래픽을 사용해서 UIView위에 손가락으로 그림을 그릴 수 있는 간단한 핑거 드로잉 캔버스를 구현해본 바 있는데, 똑같은 내용을 NSView에 적용해보고자 한다. 이전글이 Objective-C로 작성되어 있는데, 이번에는 Swift로 간단하게 작성해보려 한다. 원리는 동일하다. CGLayer를 하나 만들고, 마우스를 사용해서 뷰를 긁을 때(드래그할 때)마다  코어 그래픽을 사용해서 레이어에 그림을 그리고, 다시 뷰 리드로잉 사이클에서는 뷰에 레이어를 그리는 것이다. class TrackDrawCanvasView: NSView { var previousPoint: NSPoint? = nil lazy var drawingLayer: CGLayer? = { [unowned self] in let cs = CGColorSpace(name:CGColorSpace.sRGB)! let ctx =… 더 보기 »트랙킹 캔버스 뷰 만들기 (Cocoa)

NSResponder – Cocoa에서 키보드 이벤트를 처리하는 방법

사용자가 키보드를 두드리면 macOS는 각 키 타이핑에 대한 키 이벤트를 받게 된다. 이벤트 처리의 기본은 이벤트에 대해서 그 이벤트를 핸들링하는 어떤 함수가 실행되는 것이다. 시스템에 들어온 키 이벤트를 누가 어떻게 처리하게 될까? 제 1 응답자 마우스 이벤트의 경우, 이벤트를 받아서 처리해야 하는 주체가 분명하다. 마우스는 마우스 포인터를 통해서 화면 상에 표시되는 뷰와 상호작용한다. 하지만 키보드 이벤트는 어떤가? 키보드 이벤트를 처리하는 주체는 상황과 문맥에 따라 달라질 수 있다. 다만 사용자로서 우리는 어떠한 경우에 어떤 뷰가 키보드 타이핑을 받을 수 있는지 알… 더 보기 »NSResponder – Cocoa에서 키보드 이벤트를 처리하는 방법

[Cocoa] 마우스 커서 감지 – NSTrackingArea

특정한 뷰에 마우스가 들어오거나 나갈 때에는 이벤트가 발생하는데, 경우에 따라서는 뷰 외부의 다른 객체가 뷰에 이러한 마우스 이벤트가 일어나는 것을 감지해야 할 필요가 있다. 예를 들면 NSView에 대해 별도의 서브 클래싱 없이 마우스 이벤트 처리를 하고 싶을 때처럼 말이다. 이럴 때는 NSTrackingArea를 만들어서 원하는 뷰에 추가해주는 것으로 서브클래싱 작업을 피할 수 있다. NSTrackingArea NSTrackingArea는 마우스 추적과 커서 업데이트 이벤트를 특정한 영역에서 구현해준다. 이 추적영역 객체를 생성할 때는 다음과 같은 정보가 필요하다. 1) 영역이 어디인지 (CGRect) 2) 추적 옵션은 무엇인지 3)… 더 보기 »[Cocoa] 마우스 커서 감지 – NSTrackingArea

[Cocoa] 코코아의 이름 규칙

코코아 프레임워크에서 이름 짓는 규칙에 익숙해지는 것은 단순히 코드의 가독성을 높일 뿐만아니라 부분적으로 키-밸류 코딩의 규칙을 따르는 것과도 관련이 있다. 애플의 이름 짓기 규칙은 특히나 약어를 거의 사용하지 않고 단어나 문장을 통째로 쓰는 경향이 있는데 이러면 메소드나 변수의 이름이 길어질 수는 있지만 그 의미를 명확히 이해할 수 있을 뿐만아니라, Xcode의 멋진 자동완성기능이 있어 그리 많은 타이핑이 필요하지도 않다. 이름 짓기가 잘 된 소스는 나중에 본인이 재사용할 때도 매우 명확하고 쉽게 접근할 수 있으며, 그 자체로 소스에 대한 주석이 될 수도… 더 보기 »[Cocoa] 코코아의 이름 규칙

[iOS/OSX] Timer 사용하기

특정한 시간 이후에 작업을 시행하는 타이머를 사용하는 방법에는 몇 가지 방법이 있을 수 있는데, 코코아에서 타이머는 NSTimer 객체를 통해 구현된다. 타이머와 런루프 타이머는 런루프(Run Loop)와 밀접한 관련을 맺고 있다. 타이머는 스스로 동작기한을 가지고 있고, 그 상태로 런루프에 등록된다. 런루프는 그 기한이 지나는 시점에 타이머를 지켜보고 있다가, 타이머가 실행하기로 한 액션을 지정된 객체로 보내게 된다. 런루프는 (역시나 런루프와 스레드를 혼동하는 불편한 진실 때문에 이에 대한 별도의 포스팅도 필요할 듯) 사용자의 입력 등에 적절히 반응하기 위해서 계속해서 “기다리는” 일종의 루프이다. 예를 들면… 더 보기 »[iOS/OSX] Timer 사용하기