[OSX] 메인 윈도우 컨트롤러를 앱델리게이트에서 분리하기

iOS 앱의 경우에는 UIApplication 객체가 생성되면 해당 앱의 델리게이트가 런칭 직후의 일을 처리한다. 이 때 앱의 윈도우가 처음으로 표시할 초기 뷰 컨트롤러의 뷰를 윈도우에 보여주게 된다.
그 이후부터는 화면 단위로 각 뷰의 뷰 컨트롤러 및 여러 MVC의 컨트롤러와 여러가지 디자인패턴을 통해 상호작용하면서 앱을 구성하면 된다.
이에 비해 맥용 앱을 Xcode로 작성하고자 하면 이 “메인 컨트롤러”가 다름 아닌 앱 델리게이트 객체라는 점에서 좀 의아하게 생각된다. 즉, 메인 윈도우에 대해서는 별도의 컨트롤러가, 만약 또 다른 윈도를 생성한다면, 역시나 해당 윈도에 대해서는 별도의 컨트롤러가 있어야 하는 것 아니겠냐는 것이다.
이런 화면 단위마다 별도의 MVC를 구성하는 방법은 다음과 같다.

  1. 먼저 인터페이스 빌더 상에 초기에 생성된 MainMenu에 들어있는 윈도는 삭제한다.
  2. 메인 윈도우 뷰 컨트롤러로 쓸 객체를 새로 만든다. MainWindowController 정도?
  3. MainWindowController 객체를 MainMenu 파일에 추가한다. (NSObject를 추가해서 클래스 이름 변경)
  4. nib 파일을 새로 하나 생성한다. 이름은 MainWindow가 되면 되겠다.
  5. IB에서 새로 만든 메인 윈도우 nib의 File’s owner를 새로 생성한 윈도우 컨트롤러로 지정한다. 또한 이 인터페이스 파일의 윈도우를 MainWindowController의 window 아울렛과 연결해준다.
그러면 다음과 같은 순으로 런칭이 시작된다.
  1. 어플리케이션이 런칭되면서 MainMenu.nib 파일을 로딩한다.
  2. nib 파일이 로드되면  nib 파일 내에 정의된 객체를 초기화하고, 이 객체들에게 모두 awakeFromNib 메시지를 보낸다. 따라서 우리가 만든 윈도우 컨트롤러 객체도 이 메시지를 받게 될 것이다.
  3. 윈도 컨트롤러 객체에서 이 메시지를 받으면 메인 윈도우가 들어있는 nib 파일을 로드하고, 윈도를 표시하도록 한다.
즉, 새로 생성한 메인윈도 컨트롤러의 인터페이스 파일에서 window 프로퍼티를 하나 만들어 준다.
@property (assign) IBOutlet NSWindow *window;
이 프로퍼티는 아래와 같이 사용할 수 있다. 이제 메인 윈도의 컨트롤러는 앱 델리게이트와 분리하는데 성공했다.
-(void)awakeFromNib
{
    if (!self.window) [NSBundle loadNib:@"MainWindow" owner:self];
    [self.window makeKeyAndFrontOf:self];
}

이제 앱을 빌드하고 실행해보면 해당 윈도우가 표시될 것이다.

Read more

워드프레스에서 고스트로 이전

워드프레스에서 고스트로 이전

이 글을 쓰면서도 믿기 힘든 사실인데, 블로그라는 걸 처음 시작한지가 20년이 되었습니다. 이글루스에서 처음 시작했다가, SK컴즈가 인수한다고 발표함과 동시에 워드프레스로 플랫폼을 옮겼죠. 워드프레스오 옮긴 이후에는 호스팅 환경을 이리 저리 옮기긴 했지만 거의 18년 가까이 워드프레스를 사용해온 것 같습니다. 그 동안 워드프레스는 블로깅 툴에서 명실상부한 범용CMS로 발전했습니다. 사실 웬만한 홈페이지들은 이제

By sooop
띄어쓰기에 대한 생각

띄어쓰기에 대한 생각

업무 메일을 쓸 때 가장 많이 쓰는 말 중에 하나가 메일 말미에 ‘업무에 참고 부탁 드립니다.‘인데요, 어느 날부터 아웃룩에서 이 ‘부탁 드립니다’가 틀렸다고 맞춤법 지적을 하기 시작했습니다. 맞는 말은 ‘부탁드립니다’라고 붙여 쓰는 거라고. 사실 아래아한글 시절부터 이전의 MS워드까지, 워드프로세서들의 한국어 맞춤법 검사 실력은 거의 있으나 마나 한

By sooop

구글 포토에서 아이클라우드로 탈출한 후기

한 때 구글 포토가 백업 용량을 무제한으로 제공해 주겠다고해서, 구글 포토를 사용해서 사진을 백업해왔습니다. 물론 이 이야기의 결말은 저나 이 글을 읽고 있는 여러분이나 모두 알고 있습니다. 사실 AI에게 학습 시킬 이미지 데이터를 모으기 위한 것일 뿐이라거나 하는 이야기는 그 당시에도 있었습니다만, 에이 그래도 구글인데 용량은 넉넉하게 주겠지…하는 순진한

By sooop

Julia의 함수 사용팁

연산자의 함수적 표기 Julia의 연산자는 기본적으로 함수이며, 함수 호출 표기와 같은 방식으로 호출하는 것이 가능합니다. 또한 그 자체로 함수이기 때문에 filter(), map() 과 같이 함수를 인자로 받는 함수에도 연산자를 그대로 적용하는 것이 가능합니다. 특히 + 연산자는 sum() 함수와 같이 여러 인자를 받아 인자들의 합을 구할 수 있습니다. 2 + 3 # = 5 +(2,

By sooop