Обновить меню из RxSwift подписки - PullRequest
1 голос
/ 18 марта 2020

Я обновляю меню (добавление, удаление элемента) из функции подписки RxSwift. Вот как должно выглядеть меню:

enter image description here

«Элемент 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»):

enter image description here

После закрытия меню (отслеживание потеряно) и его повторного открытия (на этот раз без изменений в модели, поэтому приведенный выше фрагмент кода не будет запущен), меню выглядит так, как и должно быть:

enter image description here

Я уже пробовал что-то вроде NSMenu.update(), но это как-то не помогает правильно нарисовать NSMenu при открытии. Вы знаете, если я наблюдал здесь что-то очень важное?

1 Ответ

1 голос
/ 20 марта 2020

Приведенный выше код будет включен и активирован сразу после того, как делегат NSMenu func menuWillOpen(_ menu: NSMenu)

. Вместо этого вы должны установить код для запуска в любое время, когда массив изменяется, не устанавливайте ie в значение menuWillOpen(_:). Таким образом, массив пунктов меню всегда будет в правильном состоянии при открытии меню.

...