본문 바로가기

Programing/My OSS

[Cocoa] 메뉴의 응답을 Controller에서 받게 하기

First Responder에 대해 정확히 이해를 못해서 메뉴에 대한 핸들러를 구현하는데 어렵게 했다.

결론적으로 아래 동영상이 큰 힌트를 주었다.

youtu.be/buhMugErboM?t=1176

유즈케이스: Help 메뉴에 대해 링크를 구현

xcode에서 macOS 앱을 만들면 기본적으로 다양한 메뉴를 자동으로 만들어준다.

맨 오른쪽에 Help 메뉴가 있는데 핸들러는 구현이 되어 있지않다.

 

스토리보드를 만들면 ViewController가 기본적으로 만들어져 있다.

여기에 핸들러를 구현을 해도 응답이 오지 않는다.

import Cocoa

class ViewController: NSViewController {
    // ..
    @IBAction func showHelp(_ sender: Any) {
        guard let menuItem = sender as? NSMenuItem else { return }
        print(menuItem)
    }

그 이유는 해당 컨트롤러가 기본적으로 First Responder에 대한 응답을 받겠다고 하지 않기 때문이다.

방법은 간단하다. 받겠다고 알려주는 인터페이스를 추가해주면 된다.

import Cocoa

class ViewController: NSViewController {
    // ..
    override var acceptsFirstResponder: Bool {
        return true
    }

    @IBAction func showHelp(_ sender: Any) {
        guard let menuItem = sender as? NSMenuItem else { return }
        print(menuItem)
    }

아래는 별로 도움이 안되었던 링크

- stackoverflow.com/questions/35879475/overriding-menus-in-swift-with-storyboard