콘텐츠로 건너뛰기
Home » Development » Cocoa » Page 3

Cocoa

KVC 집합 접근자/변경자 메소드 작성방법

키밸류 코딩의 집합 접근자/변경자 메소드 to-many 관계의 프로퍼티에 대한 조정은 키밸류 코딩에서 배열 프록시를 통해서 이루어진다고 했다. 이 때 개별 원소를 추가/삭제/교체하는 작업의 효율을 높이고, 각 동작에 대해서도 KVO 지원을 가능하게 하기 위해서 배열 프록시와 연계하여 동작할 수 있는 집합 메소드를 추가로 정의하는 것이 강력하게 권장된다. 이들 메소드들은 기본적으로 NSMutableArray의 기본적인 액세스 메소드들에 키 이름이 혼합된 형태로, 일정한 규칙에 의해 이름 지어진다. 단, 키 이름이 메소드 이름에 들어가기 때문에 메소드명이 고정되지 않았고, 따라서 NSKeyValueCoding 레퍼런스 상에서는 소개되지 않는다. 집합 접근자… 더 보기 »KVC 집합 접근자/변경자 메소드 작성방법

키밸류 코딩의 검색 패턴과 그 동작방식

키밸류 코딩은 런타임에 문자열로 된 프로퍼티 이름을 키로 하여 임의의 객체로부터 고정된 접근자가 아닌 임의의 키를 통해서 특정한 프로퍼티 값을 액세스하는 기술이다. 이는 코드에 고정되지 않은 특정 프로퍼티를 접근할 수 있게 하여 유연성을 극대화하는 동시에 “코드를 작성을 줄여주는” 코코아의 여러가지 하위 프레임워크 기술들을 사용하는 근간이 된다. 키밸류 코딩 호환 클래스를 작성하는 기본적인 방법은 이전 포스팅에서 간단히 살펴보았다. 여기서는 실제로 키밸류 코딩에서의 접근자는 어떤식으로 동작하는지를 살펴보고, 집합 형식의 프로퍼티가 KVO 호환이 되기 위해서 필요한 집합 접근자/변경자에 대해서 살펴보겠다. 기본 접근자의 검색… 더 보기 »키밸류 코딩의 검색 패턴과 그 동작방식

트랙킹 캔버스 뷰 만들기 (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)

AppKit의 스크롤뷰, NSScrollView 사용법

iOS에서 화면에 표시할 수 있는 뷰 영역보다 큰 콘텐츠를 표시하기 위해서는 UIScrollView를 사용해서 스크롤 및 확대/축소에 대한 지원을 손쉽게 구현할 수 있음을 우리는 알고 있다. 그렇다면 macOS 환경에서 스크롤뷰는 어떤식으로 구현될 수 있고, 또 그만큼 손쉽게 사용할 수 있을까? 비슷한 스크롤 서비스를 제공한다는 공통점에도 불구하고 데스크톱 환경은 우리가 생각하는 것보다 훨씬 더 복잡하고 많은 요소가 관계하고 있으며 따라서 데스크톱 환경에서의 스크롤은 쉽지 않을지 모른다. 이번 포스팅에서는 AppKit에서 제공하는 스크롤 뷰인 NSScrollView에 대해 알아보자
더 보기 »AppKit의 스크롤뷰, NSScrollView 사용법

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

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

NSImage와 이미지 표현형에 대해 – Cocoa

코코아에서 이미지를 표현하는 클래스로 기본적으로 NSImage를 쓴다. 앱킷에서 이 클래스는 다양한 기본 포맷의 이미지에 대해서 사용할 수 있고, 이미지를 로드하거나, 이미지를 그리는 등의 거의 모든 작업에서 주로 사용되는 클래스이다. 사실 NSImage는 어떤 이미지값을 감싸는 wrapper인데, 우리의 상식과는 달리 이 클래스 자체는 자신의 내부에 들어있는 이미지 데이터에 대해서 별로 아는게 없다. 어떤 이미지는 단일 이미지 내에 표현형에 따라서 여러벌의 이미징 데이터를 가지고 있는 경우가 있기 때문에, NSImage는 이러한 데이터를 담는 일종의 배열처럼 동작할 뿐이고, 실제로 렌더링되는 이미지 데이터는 이미지 표현형 객체에… 더 보기 »NSImage와 이미지 표현형에 대해 – Cocoa

AutoLayout을 코드로 정의하기 (Swift)

오토레이아웃 오토레이아웃이 도입되기 이전에도 코코아 및 코코아터치에서는 상위뷰나 윈도가 크기가 변하는 경우에 하위 뷰들의 크기가 그에 따라 어떻게 변할 것인지를 결정해주는 방법이 있었다. 흔히 spring & struts라 불리는 오토리사이징 마스크가 그것이다. 하지만 오토 리사이징 마스크는 한 가지 문제가 있는데, 그것은 오토 리사이징 마스크는 수퍼뷰와 서브뷰 둘 사이의 관계만을 정의하기 때문에 이를 따라 뷰의 크기나 위치가 움직일 때 서브 뷰 간의 레이아웃이 흐트러질 수 있는 가능성이 매우 많다는 것이다. 그리하여 예전에는 화면의 회전이나 키보드가 올라오는 등의 과정이 발생하면[^0-1] 뷰의 크기가 전환되는데… 더 보기 »AutoLayout을 코드로 정의하기 (Swift)

Nib 파일로부터 UI 관련 객체를 로딩하기

nib 파일에서 뷰/뷰컨트롤러를 가져오기

UIView를 상속받은 커스텀 뷰를 작성할 때, 뷰의 서브 뷰들을 일일이 동적으로 구성하는 것보다 인터페이스 빌더를 통해서 구성하는 것이 더 편한 경우가 있다. 흔히 테이블 뷰의 셀에 쓰이는 뷰가 이런 식으로 구성하기 좋다.  코드 상으로 모든 뷰의 구성 요소들을 일일이 구성하고 초기화하는 것은 너무 번거로우니, 메인 스토리보드와는 별개의 nib 파일에 뷰를 세팅하고 이를 로드하는 방식으로 좀 더 간결하고 예쁘게 처리할 수 있는 방법이 있을지 고민해보자.더 보기 »Nib 파일로부터 UI 관련 객체를 로딩하기

테이블 뷰에서 드래그하여 재정렬하기 – Cocoa, Swift

도전과제 – 테이블 뷰에서 row를 드래그하여 재정렬해보자.

드래그 앤 드롭의 매커니즘과 구현방법에 대해서 살펴보았었는데, 그렇다면 테이블 뷰에서 드래그 앤 드롭으로 데이터의 순서를 임의의 순서대로 바꿀 수 있는가에 대해서 살펴보자.더 보기 »테이블 뷰에서 드래그하여 재정렬하기 – Cocoa, Swift

UI컨트롤의 활성화여부를 동적으로 결정하는 법 – Cocoa, Swift

NSUserInterfaceValidations 특정한 메뉴 항목이나 버튼, 테이블뷰, 텍스트뷰 및 텍스트 필드등이 특정한 조건에 따라 활성화/비활성화되어야 하는 경우에 이를 처리하는 전략으로는 두 가지 방법이 있다. 특정 조건값이 변경될 때 (변경지점에서, 혹은 옵저빙을 통해서) 관련된 컨트롤의 활성화 여부를 변경해주는 방법 특정 조건값을 계산 프로퍼티로 만든 후, 이를 코코아 바인딩으로 컨트롤의 enabled 키와 연결하는 방법 코코아에서는 이 외에도 컨트롤에 대한 유효성 검사 매커니즘을 별도로 가지고 있다. 컨트롤이 화면에 표시될 때, 해당 컨트롤의 타깃이 NSUserInterfaceValidations 프로토콜을 따르고 있다면 해당 프로토콜의 메소드를 호출하여 자신의 유효성 여부를… 더 보기 »UI컨트롤의 활성화여부를 동적으로 결정하는 법 – Cocoa, Swift