Я обновляю меню (добавление, удаление элемента) из функции подписки RxSwift. Вот как должно выглядеть меню:
«Элемент A» будет постоянно добавляться и удаляться в зависимости от изменений модели, например:
// Using ObservableArray (https://github.com/safx/ObservableArray-RxSwift)
model.changeset.rx()
.observeOn(MainScheduler.instance)
.subscribe(onNext: { (changes) in
// Inserts
for change in changes.insertedElements {
guard let item = self.newItem(item: change) else { continue }
let index = (self.view?.indexPlaceholder(at: .specialItem) ?? 0) + 1
// self.view is a NSMenu Object, so menu item will be added here
self.view?.addItem(at: index, item: bridgeItem))
}
// Deletes
for change in changes.deletedElements {
guard let menuItems = self.view?.getItems(withIdentifier: .specialItem) else { continue }
guard let newIndex = menuBridgeObjects.firstIndex(where: {
...
}
let index = (self.view?.indexPlaceholder(at: .specialItem) ?? 0) + 1 + index
// self.view is a NSMenu Object, so menu item will be removed here
self.view?.removeItem(safe: index, onlyIf: .specialItem)
}
}).disposed(by: disposeBag)
}
Приведенный выше код будет включен и запущен сразу после делегата NSMenu func menuWillOpen(_ menu: NSMenu)
.
Однако я понял, что сразу после открытия меню, после кода Приведенный выше фрагмент добавил новый NSMenuItem, когда меню открыто, меню выглядит следующим образом (отсутствует разделитель под элементом «Элемент A»):
После закрытия меню (отслеживание потеряно) и его повторного открытия (на этот раз без изменений в модели, поэтому приведенный выше фрагмент кода не будет запущен), меню выглядит так, как и должно быть:
Я уже пробовал что-то вроде NSMenu.update()
, но это как-то не помогает правильно нарисовать NSMenu при открытии. Вы знаете, если я наблюдал здесь что-то очень важное?