您可以存储对条形按钮项或按钮的引用,并在每次影响菜单中可用操作的任何状态更改时重新创建菜单。menu
是一个可设置的属性,因此可以在创建按钮后随时更改。您还可以像这样获取当前菜单并替换其子项:button.menu = button.menu?.replacingChildren([])
例如,对于在状态更改时未通知您的情况,您确实需要能够在菜单出现之前对其进行更新。有一个UIDeferredMenuElement
API 允许动态生成操作。这是一个块,您可以在其中调用提供数组的完成处理程序UIMenuElement
。带有加载 UI 的占位符由系统添加,并在您调用完成处理程序后被替换,因此它支持异步确定菜单项。然而,这个块只被调用一次,然后它被缓存和重用,所以这并不能满足我们在这个场景中所需要的。iOS 15 添加了一个新的未缓存提供程序 API,其行为方式相同,只是每次显示元素时都会调用块,这正是我们在这种情况下所需要的。
barButtonItem.menu = UIMenu(children: [
UIDeferredMenuElement.uncached { [weak self] completion in
var actions = [UIMenuElement]()
if self?.includeTestAction == true {
actions.append(UIAction(title: "Test Action") { [weak self] action in
self?.performTestAction()
})
}
completion(actions)
}
])
在此 API 存在之前,我确实为UIButton
您发现可以在用户通过目标/操作按下时更改菜单,如下所示button.addTarget(self, action: #selector(buttonTouchedDown(_:)), for: .touchDown)
:这只有showsMenuAsPrimaryAction
在错误的情况下才有效,因此他们必须长按才能打开菜单。我没有找到解决方案UIBarButtonItem
,但您可以使用 aUIButton
作为自定义视图。