はじめに
Safariのように、新しいタブを開けるmacアプリの作り方を紹介します。
やり方
コード全体
import SwiftUI
struct ContentView: View {
var body: some View {
VStack {
Button {
createNewTab()
} label: {
Text("Open new tab")
}
}
.padding()
}
func createNewTab() {
let text = Text("Hello new tab!")
.frame(maxWidth: .infinity, maxHeight: .infinity)
let window = NSWindow()
window.contentView = NSHostingView(rootView: text)
window.title = "New Tab"
window.styleMask = [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView]
if let keyWindow = NSApp.keyWindow {
keyWindow.tabGroup?.addWindow(window)
}
let _ = NSWindowController(window: window)
}
}
ポイント
1. NSWindow
を作る
let window = NSWindow()
2. NSWindow
のcontentView
にNSHostingView
を設定する
window.contentView = NSHostingView(rootView: text)
こうすることで、SwiftUIのViewをNSWindow
に表示できます。
3. NSWindow
のtitle
を設定する
window.title = "New Tab"
4. NSWindow
のstyleMask
を設定する
window.styleMask = [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView]
これがないと、基本的なウィンドウ操作ができません。
5. NSWindow
をNSApp.keyWindow
のtabGroup
に追加する
if let keyWindow = NSApp.keyWindow {
keyWindow.tabGroup?.addWindow(window)
}
NSApp.keyWindow
で現在アクティブなウィンドウを取得し、取得したウィンドウのtabGroup
にNSWindow
を追加します。
6. NSWindowController
を作る
let _ = NSWindowController(window: window)
これがないと、タブを閉じた時にクラッシュします。
おわりに
新しいタブを開く方法を紹介しました。この方法を使えば、Safariのようなタブを中心としたアプリを作ることができます。
デモ動画