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];
}