【问题标题】:NSSplitViewController does not call delegate methodsNSSplitViewController 不调用委托方法
【发布时间】:2020-02-10 20:25:34
【问题描述】:

我正在使用 NSSplitViewController 子类,并且没有调用委托方法。

这纯粹是编程方式,没有 nib/storyboard。

可以将代码复制到新项目中。该文件需要命名为 main.swift。同时删除项目设置中的“主界面”。

// 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,如果已实现)。

【问题讨论】:

  • 你在做什么来调用那个方法?
  • 这个方法是委托方法,所以我的代码不能调用它。
  • 我明白了。那么你期望什么时候调用这个方法呢?用户交互?
  • 您的样本不适合我。 “这纯粹是在没有 nib/storyboard 的情况下以编程方式。代码可以复制到新项目中”>“-[NSNib _initWithNibNamed:bundle:options:] 无法加载 nibName:在 bundle 中查看(空)。”
  • 这里也一样。 @Elliot:请提供minimal reproducible example

标签: swift macos nssplitviewcontroller


【解决方案1】:

没有调用委托方法,因为MySplitViewControllerapplicationDidFinishLaunching 的末尾释放。让AppDelegate 持有对MySplitViewController 的强引用。

【讨论】:

    猜你喜欢
    • 2012-09-22
    • 2014-11-21
    • 2017-02-14
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多