NSOutlineViewのNSTableCellViewを編集状態にする方法

View basedなNSOutlineViewでダブルクリックされたセルを編集状態にする方法です。

NSOutlineViewを継承してfunc mouseDown(with event: NSEvent)
オーバーライドする必要があります。

class MyOutlineView: NSOutlineView {
    override func mouseDown(with event: NSEvent) {
        super.mouseDown(with: event)

        guard event.clickCount >= 2 else {
            return
        }

        let point = convert(event.locationInWindow, from: nil)
        let selectedRow = row(at: point)

        guard selectedRow != NSOutlineViewDropOnItemIndex else {
            return
        }

        editColumn(0, row: selectedRow, with: nil, select: true)
    }
}

func editColumn(_ column: Int, row: Int, with event: NSEvent?, select: Bool)
呼ぶことで編集状態になります。
このメソッドは指定されたセルが 編集可能(isEditable == true) なら編集状態にしてくれます。

システムアイコンのNSImageを作る方法

Finderで表示されるフォルダーのアイコンなどを作る方法。

let folderIcon: NSImage = NSWorkspace.shared().icon(forFileType: NSFileTypeForHFSTypeCode(OSType(kGenericFolderIcon)))

kGenericFolderIconを変更すれば色々なアイコンを取得できます。

元となるアイコンファイルは下記のパスにあります。

/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources

macOS app FullScreen時にToolbarを隠す

画像のようなToolbarを持つアプリをFullScreenにした時に
Toolbarを隠すにはNSWindowDelegateを設定します。

// NSWindowDelegateを設定
class WindowController: NSWindowController {
    override func windowDidLoad() {
       super.windowDidLoad()
    window?.delegate = self
    }
}

extension WindowController: NSWindowDelegate {
    func window(_ window: NSWindow,
                willUseFullScreenPresentationOptions proposedOptions: NSApplicationPresentationOptions = []) -> NSApplicationPresentationOptions {
        return [
            .fullScreen,
            .hideDock,
            .autoHideMenuBar,
            .autoHideToolbar
        ]
    }
}

隠れたToolbarはマウスカーソルを画面上部に移動させると表示されます。

なお、NSApplicationPresentationOptionsの組合せには制限があります。
正しくない組合せを指定すると落ちることもあるので
上記以外の組合せを試す場合はドキュメントを参照してください。

参考

NSApplicationPresentationOptions - NSApplication | Apple Developer Documentation

指定したURLをFinderで開く

コンテキストメニューでよくみかけるShow in Finderを実装する方法です。

let url: URL! = URL(string: fileOrDirectoryPath)
NSWorkspace.shared().activateFileViewerSelecting([url])

ディレクトリを指定した場合はopenでも開けますが、
ファイルを指定した場合は開けないか、関連付けされているアプリが開いてしまいます。

NSWorkspace.shared().open(url) // NG: Finderを開く用途では使えない

参考

activateFileViewerSelecting(_:) - NSWorkspace | Apple Developer Documentation