NSSplitViewController не вызывает методы делегата - PullRequest
1 голос
/ 10 февраля 2020

Я использую подкласс NSSplitViewController, и методы делегата не вызываются.

Это чисто программно без пера / раскадровки.

Код можно скопировать в новый проект. Файл должен называться 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, если он реализован).

1 Ответ

3 голосов
/ 11 февраля 2020

Метод делегата не вызывается, потому что MySplitViewController освобождается в конце applicationDidFinishLaunching. Пусть AppDelegate содержит сильную ссылку на MySplitViewController.

...