Secara konseptual, inilah yang terjadi:
- Cukup memanggil
NSWindow.addTabbedWindow(_:ordered:)
untuk menambahkan jendela ke bilah tab asli.
- Setelah Anda memasukkan
NSResponder.newWindowForTab(_:)
ke dalam rantai responden di jendela utama, tombol "+" akan terlihat.
- Saat Anda menyetel
window.tabbingMode = .preferred
, bilah tab akan selalu terlihat.
Namun, ada beberapa kendala saat menerapkan metode ini.
Terapkan newWindowForTab
Jadi di mana menambahkan @IBAction override func newWindowForTab(_ sender: Any?)
agar Anda dapat menelepon NSWindow.addTabbedWindow(_:ordered:)
?
- Jika Anda menggunakan Storyboard, masukkan ini ke dalam subkelas
NSWindowController
yang Anda miliki. Itu cara paling sederhana untuk menghubungi NSWindow
untuk menelepon addTabbedWindow
.
- Jika Anda menggunakan Xibs,
AppDelegate
akan memiliki referensi ke jendela utama. Anda bisa meletakkan caranya di sini.
- Jika Anda menggunakan pengaturan terprogram, letakkan di mana pun Anda mengetahui instance
NSWindow
utama.
Jadikan Tombol "+" Berfungsi
TL;DR: Saat Anda menginisialisasi jendela baru, simpan windowController
jendela di suatu tempat. Anda perlu mempertahankan referensi yang kuat agar peristiwa jendela tidak dapat ditangani (di pengontrol).
Saya menulis aplikasi contoh dengan TabManager yang menangani hal ini: https://github.com/DivineDominion/NSWindow-Tabbing
Dan postingan blog dengan detail: https://christiantietze.de/posts/2019/07/nswindow-tabbing-multiple-nswindowcontroller/
Pertimbangkan bagaimana acara dikirim. Pesan Menu Utama dikirim ke rantai responden, dan begitu pula newWindowForTab
. NSApp.sendAction
akan gagal untuk kejadian standar jika sumber panggilan tidak terhubung sepenuhnya -- artinya, setidaknya hingga NSWindowController
Anda, bahkan mungkin hingga AppDelegate
Anda.
Anda harus memastikan setiap jendela tambahan yang Anda tambahkan, pada kenyataannya, merupakan bagian dari rantai responden yang sama dengan jendela asli, atau item menu akan berhenti berfungsi (dan berwarna abu-abu/dinonaktifkan). Demikian pula, tombol "+" berhenti berfungsi saat Anda mengkliknya.
Inilah yang disebut @JohnV di komentar jawaban lain: "tanpa variabel subview, Anda tidak dapat membuat lebih dari dua tab". Itu efeknya, tapi itu bukan penjelasan sebenarnya. Anda selalu dapat membuat lebih banyak tab, tetapi hanya dari jendela/tab asli, bukan yang baru; itu karena tab lainnya tidak merespons newWindowForTab
.
"Tab lainnya" sendiri hanyalah NSWindow
. Namun implementasi newWindowForTab
Anda berada di pengontrol. Itu naik satu tingkat.
Mengadaptasi kode oleh @Peter Ahlberg, ini akan berhasil:
class WindowController: NSWindowController {
@IBAction override func newWindowForTab(_ sender: Any?) {
let windowController: WindowController = self.storyboard?.instantiateInitialController() as! WindowController
let newWindow = windowController.window
self.window?.addTabbedWindow(newWindow, ordered: .above)
newWindow.orderFront(self.window)
newWindow.makeKey()
// Store the windowController in a collection of sorts
// to keep a strong reference and make it handle events:
// (NSApp.delegate as? AppDelegate).addManagedWindowController(windowController)
}
}
Saya tidak perlu menambahkan newWindowForTab
ke AppDelegate
agar semuanya berfungsi menggunakan Storyboard -- karena dengan cara ini pengontrol jendela tetap melakukan tugasnya dan tidak memerlukan fallback!
person
ctietze
schedule
23.01.2019
newWindowForTab
dengan benar di NSWindowController saya sehingga tampilan dari Storyboard saya muncul. - person DaPhil   schedule 06.11.2016