gpt4 book ai didi

swift - 从 RxSwift 订阅中更新菜单

转载 作者:行者123 更新时间:2023-12-03 17:08:49 25 4
gpt4 key购买 nike

我正在 RxSwift 订阅者中更新菜单(添加、删除项目)。菜单应该是这样的:

enter image description here

“Item 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 的任何修改和菜单都会通过订阅者进行更改,菜单看起来像这样(缺少“Item”下面的分隔符项) A”):

enter image description here

关闭菜单(跟踪丢失)并再次重新打开(这次模型没有更改,因此不会触发上面的代码片段)后,菜单看起来应该是这样的:

enter image description here

我已经尝试过类似 NSMenu.update() 的方法,但这在某种程度上无助于在打开时正确绘制 NSMenu。你知道我是否在这里监督了一些非常重要的事情吗?

最佳答案

The code above will be enabled and triggered immediately after NSMenu's delegate func menuWillOpen(_ menu: NSMenu)

我觉得上面的内容不对。您应该将代码设置为在数组更改时触发,不要将其绑定(bind)到 menuWillOpen(_:)。这样,当菜单打开时,菜单项数组将始终处于正确的状态。

关于swift - 从 RxSwift 订阅中更新菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60735774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com