ตามแนวคิด นี่คือสิ่งที่เกิดขึ้น:
- การเรียก
NSWindow.addTabbedWindow(_:ordered:)
เพื่อเพิ่มหน้าต่างให้กับแถบแท็บดั้งเดิมก็เพียงพอแล้ว
- เมื่อคุณใส่
NSResponder.newWindowForTab(_:)
ลงในห่วงโซ่การตอบกลับของหน้าต่างหลัก ปุ่ม "+" จะมองเห็นได้
- เมื่อคุณตั้งค่า
window.tabbingMode = .preferred
แถบแท็บจะมองเห็นได้เสมอ
อย่างไรก็ตาม มีข้อควรระวังบางประการเมื่อนำวิธีการเหล่านี้ไปใช้
นำไปใช้ newWindowForTab
แล้วจะเติม @IBAction override func newWindowForTab(_ sender: Any?)
ได้ที่ไหนถึงจะโทร NSWindow.addTabbedWindow(_:ordered:)
ได้?
- หากคุณใช้สตอรี่บอร์ด ให้ใส่สิ่งนี้ลงในคลาสย่อย
NSWindowController
ที่คุณเป็นเจ้าของ นั่นเป็นวิธีที่ง่ายที่สุดในการไปที่ NSWindow
เพื่อโทร addTabbedWindow
- หากคุณใช้ Xibs
AppDelegate
จะมีการอ้างอิงไปยังหน้าต่างหลัก คุณสามารถใส่วิธีการได้ที่นี่
- หากคุณใช้การตั้งค่าแบบเป็นโปรแกรม ให้วางไว้ทุกที่ที่คุณรู้จักอินสแตนซ์
NSWindow
หลัก
ทำให้ปุ่ม "+" ใช้งานได้
TL;DR: เมื่อคุณเริ่มต้นหน้าต่างใหม่ ให้เก็บ windowController
ของหน้าต่างไว้ที่ไหนสักแห่ง คุณต้องรักษาการอ้างอิงที่รัดกุมเพื่อไม่ให้จัดการเหตุการณ์หน้าต่าง (ในคอนโทรลเลอร์)
ฉันเขียนแอปตัวอย่างด้วย TabManager ที่ดูแลสิ่งนี้: https://github.com/DivineDominion/NSWindow-Tabbing
และบล็อกโพสต์พร้อมรายละเอียด: https://christiantietze.de/posts/2019/07/nswindow-tabbing-multiple-nswindowcontroller/
คำนึงถึงวิธีการจัดกิจกรรมต่างๆ ข้อความเมนูหลักจะถูกส่งไปตาม สายการตอบกลับ และ newWindowForTab
ก็เช่นกัน NSApp.sendAction
จะล้มเหลวสำหรับเหตุการณ์มาตรฐาน หากแหล่งที่มาของการโทรเชื่อมต่อไม่สุด นั่นหมายความว่า อย่างน้อยก็สูงถึง NSWindowController
ของคุณ หรืออาจจะถึง AppDelegate
ของคุณด้วยซ้ำ
คุณต้องแน่ใจว่าหน้าต่างเพิ่มเติมใดๆ ที่คุณเพิ่มนั้น แท้จริงแล้วเป็นส่วนหนึ่งของห่วงโซ่การตอบกลับเดียวกันกับหน้าต่างเดิม ไม่เช่นนั้นรายการเมนูจะหยุดทำงาน (และเป็นสีเทา/ปิดใช้งาน) ในทำนองเดียวกัน ปุ่ม "+" จะหยุดทำงานเมื่อคุณคลิก
นี่คือสิ่งที่ @JohnV ในความคิดเห็นของคำตอบอื่นที่เรียกว่า: "หากไม่มีตัวแปรมุมมองย่อย คุณไม่สามารถสร้างมากกว่าสองแท็บได้" นั่นคือผลกระทบ แต่ไม่ใช่คำอธิบายที่แท้จริง คุณสามารถสร้างแท็บเพิ่มเติมได้ตลอดเวลา แต่เฉพาะจากหน้าต่าง/แท็บเดิมเท่านั้น ไม่ใช่จากหน้าต่างใหม่ นั่นเป็นเพราะอีกแท็บหนึ่งไม่ตอบสนองต่อ newWindowForTab
"อีกแท็บหนึ่ง" เองนั้นเป็นเพียง NSWindow
อย่างไรก็ตาม การใช้งาน newWindowForTab
ของคุณอยู่ใน ตัวควบคุม นั่นก็ขึ้นมาหนึ่งระดับแล้ว
การปรับโค้ดโดย @Peter Ahlberg สิ่งนี้จะได้ผล:
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)
}
}
ฉันไม่จำเป็นต้องเพิ่ม newWindowForTab
ถึง AppDelegate
เพื่อให้ทุกอย่างทำงานได้โดยใช้สตอรี่บอร์ด เพราะวิธีนี้ทำให้ตัวควบคุมหน้าต่างทำงานต่อไปและไม่ต้องการทางเลือกอื่น!
person
ctietze
schedule
23.01.2019
newWindowForTab
อย่างถูกต้องใน NSWindowController ของฉันเพื่อให้มุมมองจากกระดานเรื่องราวของฉันปรากฏขึ้น - person DaPhil   schedule 06.11.2016