【问题标题】:Update menu from within RxSwift subscribe从 RxSwift 订阅更新菜单
【发布时间】: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


    【解决方案1】:

    上面的代码会在NSMenu的委托func menuWillOpen(_ menu: NSMenu)之后立即启用和触发

    以上对我来说是错误的。您应该设置代码以在数组更改时触发,不要将其绑定到menuWillOpen(_:)。这样菜单项数组在菜单打开时将始终处于正确状态。

    【讨论】:

    • 感谢您的回答。通过 RxSwift 订阅是在应用程序启动期间完成的。但是,只要用户打开菜单,就应该触发菜单项的动态添加或删除。但是你说它应该在后台定期更新,对吗?
    • 是的,我就是这么说的。
    • 我意识到调用menuWillOpen(_:)model.changeset 的观察者之间没有直接联系。即使从menuWillOpen(_:) 解耦并让更新在后台运行,问题仍然存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多