NSPopUpButton неактивен на игровой площадке Swift

В контроллере представления игровой площадки Swift у меня есть следующий код:

var jsonSelector = NSPopUpButton(title: "Path", target: self, action: #selector(updatePointFile))

override public func loadView() {
    let frame = CGRect(origin: CGPoint.zero, size: CGSize(width: 900, height: 600))
    let view = NSView(frame: frame)

    let array = // gets array of items
    for item in array {
        jsonSelector.addItem(withTitle: item)
    }

    view.addSubview(jsonSelector)
    self.view = view
}

@objc func updatePointFile() {
    let file = jsonSelector.selectedItem?.title ?? "swiftLogo"
    ...
}

Когда он работает, он изначально выглядит нормально:
нормальный

Но тогда, когда он нажал, это выглядит так:
сломанный

А когда вы щелкаете мышью, он остается не кликаемым:
все еще сломан

Когда я копирую тот же самый код в полное Mac-приложение, оно работает как обычно, и, чтобы сделать вещи еще более странными, однажды, когда я делал эти скриншоты, оно работало для однократного выделения и возвращалось в серое состояние.

Будем очень благодарны любой помощи.

2 ответа

Таким образом, решение этого довольно странное. Это просто требует определения цели позже.

Это означает либо

var jsonSelector = NSPopUpButton(frame: NSRect(origin: CGPoint.zero, size: CGSize(width: 100, height: 50)))

override public func loadView() {
    jsonSelector.target = self
        jsonSelector.action = #selector(updatePointFile)

    let array = // gets array of items
    for item in array {
        jsonSelector.addItem(withTitle: item)
    }

    view.addSubview(jsonSelector)
    self.view = view
}

@objc func updatePointFile() {
    let file = jsonSelector.selectedItem?.title ?? "swiftLogo"
    ...
}

или же

var jsonSelector = NSPopUpButton(title: "Path", target: self, action: #selector(updatePointFile))

override public func loadView() {
    let frame = CGRect(origin: CGPoint.zero, size: CGSize(width: 900, height: 600))
    let view = NSView(frame: frame)

    jsonSelector.target = self

    let array = // gets array of items
    for item in array {
        jsonSelector.addItem(withTitle: item)
    }

    view.addSubview(jsonSelector)
    self.view = view
}

@objc func updatePointFile() {
    let file = jsonSelector.selectedItem?.title ?? "swiftLogo"
    ...
}

работает

Здесь та же проблема, но в проекте Objective-C в NSViewController.

Это связано с цепочкой First Responder.

Я мог бы решить это с помощью этого вызова:

      - (void)viewDidAppear
{
    [super viewDidAppear];

    [self.view.window makeFirstResponder: self];
}
Другие вопросы по тегам