NSSplitViewController 不调用委托方法

NSSplitViewController does not call delegate methods

我正在使用 NSSplitViewController 子类,但未调用委托方法。

这纯粹是程序化的,没有 nib/storyboard。

可以将代码复制到新项目中。该文件需要命名为 main.swift。同时在项目设置中删除 "Main interface"。

// File: main.swift

import Cocoa

// AppDelegate

class AppDelegate: NSObject, NSApplicationDelegate {

  let window = NSWindow(
    contentRect: NSRect(x: 0, y: 0, width: 600, height: 400),
    styleMask: [ .titled, .closable, .resizable ],
    backing: .buffered,
    defer: false
  )

  func applicationDidFinishLaunching(_ aNotification: Notification) {
    let splitViewController = MySplitViewController()
    window.contentView = splitViewController.view
    window.makeKeyAndOrderFront(nil)
  }

}

// NSSplitViewController

class MySplitViewController: NSSplitViewController {

  convenience init() {
    self.init(nibName: nil, bundle: nil)
    // Left
    let viewController1 = NSViewController()
    viewController1.view = NSView()
    let item1 = NSSplitViewItem(viewController: viewController1)
    item1.minimumThickness = 100
    item1.maximumThickness = 200
    addSplitViewItem(item1)
    // Right
    let viewController2 = NSViewController()
    viewController2.view = NSView()
    let item2 = NSSplitViewItem(viewController: viewController2)
    addSplitViewItem(item2)
  }

  override func viewDidLoad() {
    super.viewDidLoad()
    print(splitView.delegate!)   // Logs "Project1.MySplitViewController"
  }

  // Never called
  override func splitView(_ splitView: NSSplitView, additionalEffectiveRectOfDividerAt dividerIndex: Int) -> NSRect {
    print("\(#function)")
    return super.splitView(splitView, additionalEffectiveRectOfDividerAt: dividerIndex)
  }

}

let application = NSApplication.shared
let applicationDelegate = AppDelegate()

application.delegate = applicationDelegate
application.run()

当 运行 代码时,您可以看到拆分视图显示并且工作正常。

viewDidLoad() 方法打印 "Project1.MySplitViewController",因此委托已设置。

但是没有调用 splitView(_:additionalEffectiveRectOfDividerAt:) 方法(或任何其他 NSSplitViewDelegate,如果已实现)。

委托方法未被调用,因为MySplitViewControllerapplicationDidFinishLaunching结束时被释放。让 AppDelegate 持有对 MySplitViewController.

的强引用