콘텐츠로 건너뛰기
Home » cocoa » Page 4

cocoa

[cocoa] 키-밸류 옵져빙 간단 예제

키-밸류 옵저빙(Key-Value Observing)은 코코아의 기초적인 기능 중 하나로, 특정 객체의 프로퍼티가 변경되었을 때, 다른 객체(옵저버)로 하여금 이를 알아차릴 수 있도록 메시지를 자동으로 보내주는 것이다. 특정 객체의 접근자에서 프로퍼티를 변경할 때마다 콜백을 호출하는 식으로 코드를 작성할 필요가 없고, 객체 외부에서 옵저버를 설치할 수 있기 때문에 다양한 상황에서 사용할 수 있다. 프로퍼티의 변경을 감지하고자 하는 대상은 NSObject의 서브 클래스이면서, 해당 프로퍼티는 키밸류 코딩 호환 가능하도록 정의된 프로퍼티여야 한다. 이 때, 해당 프로퍼티는 -setValue:ForKey: 를 사용하여 간접적으로 변경하지 않고 [anObject setProperty:value]와 같은 식으로… 더 보기 »[cocoa] 키-밸류 옵져빙 간단 예제

[Cocoa] NSValueTransformer

Value Transformer

코코아 바인딩에서 어떤 키패스의 값을 그대로 사용하는 것이 아니라 다른 단위로 변환하는 등의 변화를 주고 사용해야 한다면 중간에 어떤 매개체가 값을 바꿔서 전달해주는 역할을 하도록 해야 한다. 예를 들어 섭씨 온도를 표시하는 텍스트 필드와 화씨 온도로 조절하는 슬라이드가 있고 이 들을 코코아 바인딩으로 구현하고자 한다면, (물론 모델 객체의 두개의 프로퍼티를 각각 만들고 여기에 바인딩해도 되지만) NSValueTransformer를 사용하여 값 변환 장치를 만들어 사용할 수 있다.

사용하는 일이 흔하지는 않지만, 파운데이션 프레임워크는 이런 값 변환기를 몇 개 가지고 있으며 개발자는 NSValueTransformer를 서브클래싱하여 이런 변환기를 만들 수 있다.

더 보기 »[Cocoa] NSValueTransformer

OSX에서 애니메이션 구현 방법을 선택하는 방

OSX에서 창이나 뷰에 간단, 혹은 복잡한 애니메이션을 구현하는 방법은 다양한 층위에서 선택해야 한다. 다음은 Cocoa에서애니메이션을 적용하기 위해 어떤 수단을 선택해야 할지에 대한 가이드 내용이다. 참고로 이 가이드의 원문은 제법 오래전의 것으로 소소하게 업데이트하였다. 1. 뷰가 회전하지 않고, 주로 정적이며 커스터마이징 되지 않는 기본 코코아 컨트롤 위주로 구성되어 있다면 NSView(혹은 그 서브클래스)를 그대로 사용한다. 2. 이동이나 크기 변환과 같은 단순한 애니메이션만 적용하면 된다면 애니메이터 프록시를 사용하여 변환하면 된다. NSView는 기본적으로 NSAnimatablePropertyContainer 프로토콜을 따르고 있기 때문에 animator()를 호출하여 프록시를 얻고, 프록시를 통해… 더 보기 »OSX에서 애니메이션 구현 방법을 선택하는 방

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

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

(macOS | Swift ) NSSavePanel / NSOpenPanel

이게 무려 5년이나 된 글이고, 그 사이에 저장/열기 패널은 액션시트로 변경되면서 많은 부분이 바뀌었기에 다시 한 번 정리합니다. (2016-11-23) macOS앱에서 일반적인 파일 포맷을 다루는 경우1, 파일을 저장하거나 열려고 할 때 파일의 위치를 지정해주기 위해서 저장 / 열기 패널을 열게 된다. 이 패널은 모달하게 동작하면서 저장위치를 선택할 수 있게 하는 macOS의 공통 UI를 사용한다. NSOpenPanel, NSSavePanel은 이 때 사용하는 클래스이며, 다음과 같이 동작한다. 패널을 모달하게 열어 사용자로 하여금 저장/로딩할 파일을 설정하게 한다. 델리게이트를 통해 사용자의 선택이 완료되었을 때, 처리할 동작을 위임할… 더 보기 »(macOS | Swift ) NSSavePanel / NSOpenPanel

[Cocoa] NSFetchedResultsController

코어데이터와 UITableView와의 연결

지금까지 몇 개의 예제를 통해 코어데이터를 사용해서 일련의 데이터를 디스크에 읽고 쓰며, 이를 관리하는 방법에 대해 살펴보았는데, 이런 작업을 보다 쉽게 만들어주는 컨트롤러가 있었으니, 바로 NSFetchedResultsController이다.
이 클래스는 코어데이터의 컨텍스트를 기반으로 저장소로부터 조건에 맞는 객체를 읽어들여서, UITableView의 데이터소스 메소드에서 쉽게 사용할 수 있는 형태로 제공한다. 또한 읽어온 객체에 대해 추적 기능을 가지고 있어서 managed object에 어떤 변경이 발생할 때 이를 감지하여 적절하게 테이블 뷰에서의 변경을 만들어낼 수 있다.더 보기 »[Cocoa] NSFetchedResultsController

[Cocoa] 코어데이터 스택을 수동으로 세팅하기

코어데이터 코어데이터 코어데이터. 쉽지도 않은 내용인데 이 블로그에서 최근에 코어데이터를 지긋지긋하게 많이도 다루는 것 같다. ㅠㅡㅠ 하지만 언젠가는 피가되고 살이될 코어데이터에 대한 내용이다.
이미 “간단한” 저장은 아주 손쉽게 Keyed Archiver를 사용하여 인코딩한 객체를 파일로 바로 저장하는 것은 살펴보았다. 하지만 만약, 저장한 주소록에 사람이 수백만명이라면 엄청나게 많은 데이터가 앱이 실행될 때 한번에 메모리로 로드되어 올라갈 것이다. (이것이 아카이빙으로 내용을 저장할 때의 한계이다. 많은 데이터는 결국 한 번에 로딩해서 안고 있어야 하는 부담이 있다.)
하지만 코어데이터는 굉장히 빠르게 영구저장소를 계속해서 액세스하고, 자동으로 차등저장 및 로딩을 지원하기 때문에 데이터세트가 어느 정도까지는 커져도 괜찮다. (적어도 나는 그렇게 알고 있다.)
iOS라면 UIManagedDocument를 사용하면 문서파일 자체를 코어데이터 영구저장소 파일(데이터베이스 파일)로 바로 사용할 수 있다. 이 내용은 이미 살펴본 바가 있는데, 문제는 NSManagedDocument 라는 것은 아직 공식적으로 존재하지 않는 클래스이다. (아 이런…) 결국 코코아 앱을 시작할 때 코어데이터를 적용해주지 않으면… 콸콸콸콸…

update: macOS에서는 NSPersistentDocument 라는 클래스가 있어서 코어데이터와 NSDocument를 긴밀하게 통합하여 사용할 수 있다.

더 보기 »[Cocoa] 코어데이터 스택을 수동으로 세팅하기

[Cocoa] NSSound를 통한 초간단 사운드 재생

코코아에는 소리를 재생할 수 있는 NSSound 클래스가 있다. NSSound는 소리 재생을 위한 작업을 극도로 단순화하는 클래스로 인스턴스 메소드를 사용하는 것만으로 간단히 사운드를 재생할 수 있다. NSSound는 AIFF, WAV, NextSND 포맷을 재생할 수 있다. 음향 데이터는 디스크 상의 파일이나, 네트워크상의 URL, 페이스트 보드에 복사한 데이터가 될 수 있다. 또한 시스템에서 사용하는 사운드는 경로가 아닌 이름으로 재생이 가능하다. 이러한 시스템 사운드는 /Library/Sounds 디렉토리에 저장되어 있다. NSSound는 음향 데이터를 여러 방법으로 로딩할 수 있다. 기본적으로 시스템 라이브러리에 등록되어 있는 소리, 파일의 경로, URL… 더 보기 »[Cocoa] NSSound를 통한 초간단 사운드 재생

[Cocoa] 여러 이미지를 이어 붙이기

찾으면 찾으면 있겠지만, 손쉽게 여러 장의 이미지를 가로나 세로로 이어 붙여서 하나로 만들어주는 그런 앱이 있으면 참 좋겠다고 생각하다가, 까짓거 하나 만들면 되지 않겠냐 -_- 고 생각이 들어서 써보는 그런 포스팅 이미지 이어 붙이기 앱을 처음부터 끝까지 만들어보기에는 너무 힘든 포스트가 될 것 같아서, 여러 개의 NSImage를 이어붙이는 부분에 대해서만 살펴보기로 하자 대략의 구상 그러니까 레이어(CGLayer)같은 곳에는 이미지를 원하는 크기로 붙여넣을 수 있으니, 이미지(NSImage)들을 CGImage로 바꾸고, 최종 크기의 비트맵 컨텍스트를 만들어 여기에 이미지들을 각각 그려서 이 컨텍스트로부터 비트맵 이미지(CGImage)를 얻어서… 더 보기 »[Cocoa] 여러 이미지를 이어 붙이기

[Cocoa] NSImage를 파일로 저장하기

NSImage를 파일로 저장하기 이미지를 파일로 저장하기 위해서는 ‘표현형식'(representation)에 대해 알아야 한다. 즉 이미지 자체는 일련의 픽셀을 모아둔 데이터인데, 우리가 흔히 알고 있는 JPG, PNG 등의 파일 포맷은 이 이미지를 각각 정해진 방식으로 ‘정리’하여 파일에 저장하기 때문이다. 표현형식은 이런 파일에 저장된 비트맵 데이터를 다시 이미지로 렌더링하는 역할을 하고, 그 반대의 역할도 수행할 수 있다. NSImage는 1) TIFFRepresentation 메소드를 사용하여 표현형식을 구성하는 데이터로 만든다. 이 데이터를 사용하여 2) NSBitmapImageRep 객체를 생성하고, 이 객체에서부터 3) 실제 저장이 가능한 그래픽 파일 포맷의 데이터를 생성해서… 더 보기 »[Cocoa] NSImage를 파일로 저장하기