【发布时间】:2020-03-18 08:22:22
【问题描述】:
我正在从 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?.insertItem(bridgeItem, at: index)
}
// 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)
}
model.changeset 将根据后台运行的多个网络活动进行填充或更改。
但是,我意识到,当菜单打开时,对model.changeset 的任何修改以及通过订阅者更改菜单,菜单看起来像这样(缺少“项目 A”下方的分隔项):
关闭菜单(跟踪丢失)并重新打开后(这次模型没有变化,所以上面的代码sn-p不会被触发),菜单看起来应该是这样的:
我已经尝试过NSMenu.update() 之类的方法,但这在某种程度上无助于在打开时正确绘制 NSMenu。你知道我是否在这里监督了一些非常重要的事情吗?
【问题讨论】:
标签: swift macos cocoa rx-swift