(Swift) 복사/붙여넣기 가능한 커스텀 클래스

복사/붙여넣기를 지원하는 커스텀 클래스 만들기 복습 이전 시간에 macOS에서 클립보드를 통해서 복사와 붙여넣기를 통해서 뷰 혹은 앱간의 데이터를 교환하는 과정에 대해서 살짝 살펴보았다. 어떤 클래스의 객체가 클립보드로 복사되려면, 해당 클래스는 클립보드에게 어떤 타입의 데이터들을 넣어줄 수 있음을 알리고, 각 타입에 대한 데이터를 생성하여 클립보드에게 전달해주는 동작을 수행해야 하며, 이 동작은 NSPasteboardWriting에 정의되어 있다. 그리고 붙여넣는 시점에 특정한 클래스의 객체를 클립보드에 요청하면, 클립보드는 해당 클래스의 객체를 생성할 수 있는 타입들을 조사한 후, 조달 가능한 타입에 대응하는 데이터를 이용해서 해당 클래스 객체를

(Swift | Cocoa ) NSView를 PDF로 변환하기

뷰로부터 pdf 데이터 얻기 AppKit의 모든 그리기 명령은 PDF로 변환가능하다. 그리고 이렇게 변환된 PDF 데이터는 프린터로 보내지거나 파일에 기록될 수 있다. PDF는 해상도에 의존하지 않기 때문에 어느 기기에서 봐도 제법 괜찮은 품질을 보여준다는 점을 잊지 말자. draw:를 사용해서 뷰를 그리는 것을 할 수 있다면, PDF는 공짜로 얻을 수 있다. 이 방법은 매우 쉬운데 NSView는 다음과 같은 메소드를 가지고 있다. func dataWithPDF(inside: NSRect) -> Data 이 메소드는 draw(:)를 호출해서 이를 통해 그래픽 데이터를 얻는다. 뷰 그리기 명령에서 얻어지는 모든 내역은 화면이

(Swift | Tutorial) copy and paste 구현해보기

복사/붙여넣기를 지원하기 페이스트보드, 흔히들 클립보드라고 말하는 이 물건은 요즘 컴퓨터를 쓰는 사람들에게는 어찌보면 공기중의 산소와 같은 것이라 하겠다. 거의 모든 컴퓨터 및 스마트기기 사용자들이 의식하지도 않은채 많이 쓰는 기능일 것이다. 복사와 붙여넣기는 사용자 측면에서는 숨쉬는 것처럼 자연스러운 기능이지만,시스템 측면에서는 사실 간단한 동작은 아니다. 복사/붙여넣기는 단순히 앱 내에서 데이터를 이동하는 것 뿐만 아니라 서로 다른 앱 간에 대해서도 이를 통해서 데이터를 전달할 수 있게 된다. 또 우리가 만약 A라는 데이터를 클립보드에 복사했다 하더라도, 이 복사된 데이터에 사용처에 따라서는 B 혹은 C나

(Swift | Cocoa ) 포커스링

포커스 링 macOS 관련 책들이 워낙 오래된 것들이 많다보니, 대부분의 책에서는 다음과 같이 draw: 메소드 내에서 포커스링을 그리는 것으로 포커스링을 흉내낸다. override func draw(_ dirtyRect: NSRect) { super.draw(dirtyRect) self.bgColor.set() NSBezierPath.fill(bounds) if let fr = window?.firstResponder, fr === self { NSColor.keyboardFocusIndicatorColor.set() NSBezierPath.setDefaultLineWidth(4.0) NSBezierPath.strokeRect(bounds) } } 그리고 제 1 응답자가 되었을 때 포커스링을 그리기 위해서는 뷰가 응답자 상태에 진입하거나 빠져나올 때마다 뷰를 새로 그리도록 갱신해야 한다. override var acceptsFirstResponder: Bool { return true } override func resignFirstResponder() -> Bool { NSLog(“Resigning…”) setNeedsDisplay(bounds)

NSApplicationMain

NSApplicationMain int NSApplicationMain(int argc, const char* argv[]); 코코아 앱이 실행될 때 main 함수가 곧장 호출하는 함수로, 앱 객체를 생성하고 앱의 런칭 과정을 처리한다. 앱 객체의 클래스는 무조건 NSApplication이며, 앱 델리게이트는 nib 파일 내에 정의되어 있어야 한다. (iOS는 앱 델리게이트 클래스명을 전달하는 인자 부분이 마련되어 있음) argc, argv 파라미터가 정의되어 있지만, 실제로 값을 전달해도 무시한다. 코코아 내에서는 프로그램 실행시의 arguments를 _NSGetArgv, _NSGetArgc, _NSGetEnviron 함수들을 통해서 얻어야 한다.