如何在 UIMenu 中手动更改选定的 UIAction?
How to manually change the selected UIAction inside UIMenu?
目标:
尝试创建一个过滤器 selection 屏幕(在卡片视图中),该屏幕具有附加了 UIMenu 项目的 UIButton。
当我 select 任何过滤器并单击应用过滤器按钮时,我关闭过滤器视图控制器并返回 collection 视图屏幕以使用 [=37] 的过滤器刷新数据=]ed.
问题:
过滤器已经 selected,当我想再次返回更改任何过滤器时,我单击过滤器按钮打开过滤器 viewcontroller,但显然 none 的 UIMenu select离子被保留,因为它们被重置为默认的第一个索引设置。
如何解决?:
当我将数据从过滤器 VC 传回主列表屏幕时,我传递了 selected UIMenu 的标题。我在想我可以将它传递回过滤器VC 并将菜单默认为传入的数据,(即可以搜索标题并使其成为 UIMenu 中的 selected UIAction) ,但是我似乎无法找到一种方法来手动 select 哪个 UIAction 应该是 UIMenu 的 selected 状态!
var spaceTypeMenu: UIMenu {
return UIMenu(title: "Space Type", image: nil, identifier: nil, options: [], children: spaceTypeMenuItems)
}
private var spaceTypeMenuItems: [UIAction] {
return [
UIAction(title: "All", handler: { (_) in }),
UIAction(title: "Meeting Room", handler: { (_) in }),
UIAction(title: "Desk", handler: { (_) in }),
UIAction(title: "Boardroom", handler: { (_) in })
]
}
然后下面是从viewdidload()调用的
func createSpaceTypeMenu() {
spaceTypeButton?.menu = spaceTypeMenu
spaceTypeButton?.showsMenuAsPrimaryAction = true
}
过滤器被 select 编辑后,我将它们传递回之前的 VC:
@IBAction func applyFiltersButtonPressed(_ sender: UIButton) {
self.dismiss(animated: true) {
let filter = Filters(site: self.siteButton?.titleLabel?.text,
spaceType: self.spaceTypeButton?.titleLabel?.text,
date: self.datePickerView.datePickerView?.date,
duration: self.selectedDuration)
self.applyFiltersCallback?(filter)
}
}
站点、空间类型、持续时间都是带有 UIMenu 的 UI 按钮,用于过滤器选项,现在只是硬编码,如上所述。
我想要发生的是,如果我在调用 applyFiltersButtonPressed() 之前 select 编辑“Desks”以关闭 VC,当我返回到此过滤器时 VC我希望“Desks”仍然被 selected 作为 UIbutton 中的文本,并且还希望勾号位于“Desks”旁边并且不希望菜单项默认返回到第一个选项“All” .
希望这是有道理的?
我自己找到了如何做到这一点,希望它能帮助和我有同样经历的其他人:
private func updateActionState(actionTitle: String? = nil, menu: UIMenu) -> UIMenu {
if let actionTitle = actionTitle {
menu.children.forEach { action in
guard let action = action as? UIAction else {
return
}
if action.title == actionTitle {
action.state = .on
}
}
} else {
let action = menu.children.first as? UIAction
action?.state = .on
}
return menu
}
并且可以通过以下方式调用:
private func createSiteMenu(actionTitle: String? = nil) {
let menu = UIMenu(title: "Site", image: nil, identifier: nil, options: [], children: siteMenuItems)
siteButton?.menu = updateActionState(actionTitle: actionTitle, menu: menu)
siteButton?.showsMenuAsPrimaryAction = true
}
谢谢,这解决了我的类似问题。我正在使用 ios15 弹出式菜单和下拉式菜单,但希望通过使用原始值作为菜单选项的枚举来填充菜单。
enum SortOrder: String, Codable, CaseIterable {
case name = "Name"
case category = "Category"
case qty = "Quantity"
case value = "Value"
case token = "Token"
}
let sortClosure = { [self] (action: UIAction) in
// closure actions based on self.sortOrderPopup.currentTitle!
}
var sortOrderPopupOptions: [UIAction] = []
for sortOption in ListLibrary.SortOrder.allCases {
sortOrderPopupOptions.append(UIAction(title: sortOption.rawValue, handler: sortClosure))
}
sortOrderPopup.menu = UIMenu(children: sortOrderPopupOptions)
menuSelection = currentList.sortOrder.rawValue
sortOrderPopup.menu = updateActionState(actionTitle: menuSelection, menu: sortOrderPopup.menu!)
您的解决方案工作完美,可以调整以修改菜单的其他属性!
目标: 尝试创建一个过滤器 selection 屏幕(在卡片视图中),该屏幕具有附加了 UIMenu 项目的 UIButton。 当我 select 任何过滤器并单击应用过滤器按钮时,我关闭过滤器视图控制器并返回 collection 视图屏幕以使用 [=37] 的过滤器刷新数据=]ed.
问题: 过滤器已经 selected,当我想再次返回更改任何过滤器时,我单击过滤器按钮打开过滤器 viewcontroller,但显然 none 的 UIMenu select离子被保留,因为它们被重置为默认的第一个索引设置。
如何解决?: 当我将数据从过滤器 VC 传回主列表屏幕时,我传递了 selected UIMenu 的标题。我在想我可以将它传递回过滤器VC 并将菜单默认为传入的数据,(即可以搜索标题并使其成为 UIMenu 中的 selected UIAction) ,但是我似乎无法找到一种方法来手动 select 哪个 UIAction 应该是 UIMenu 的 selected 状态!
var spaceTypeMenu: UIMenu {
return UIMenu(title: "Space Type", image: nil, identifier: nil, options: [], children: spaceTypeMenuItems)
}
private var spaceTypeMenuItems: [UIAction] {
return [
UIAction(title: "All", handler: { (_) in }),
UIAction(title: "Meeting Room", handler: { (_) in }),
UIAction(title: "Desk", handler: { (_) in }),
UIAction(title: "Boardroom", handler: { (_) in })
]
}
然后下面是从viewdidload()调用的
func createSpaceTypeMenu() {
spaceTypeButton?.menu = spaceTypeMenu
spaceTypeButton?.showsMenuAsPrimaryAction = true
}
过滤器被 select 编辑后,我将它们传递回之前的 VC:
@IBAction func applyFiltersButtonPressed(_ sender: UIButton) {
self.dismiss(animated: true) {
let filter = Filters(site: self.siteButton?.titleLabel?.text,
spaceType: self.spaceTypeButton?.titleLabel?.text,
date: self.datePickerView.datePickerView?.date,
duration: self.selectedDuration)
self.applyFiltersCallback?(filter)
}
}
站点、空间类型、持续时间都是带有 UIMenu 的 UI 按钮,用于过滤器选项,现在只是硬编码,如上所述。
我想要发生的是,如果我在调用 applyFiltersButtonPressed() 之前 select 编辑“Desks”以关闭 VC,当我返回到此过滤器时 VC我希望“Desks”仍然被 selected 作为 UIbutton 中的文本,并且还希望勾号位于“Desks”旁边并且不希望菜单项默认返回到第一个选项“All” .
希望这是有道理的?
我自己找到了如何做到这一点,希望它能帮助和我有同样经历的其他人:
private func updateActionState(actionTitle: String? = nil, menu: UIMenu) -> UIMenu {
if let actionTitle = actionTitle {
menu.children.forEach { action in
guard let action = action as? UIAction else {
return
}
if action.title == actionTitle {
action.state = .on
}
}
} else {
let action = menu.children.first as? UIAction
action?.state = .on
}
return menu
}
并且可以通过以下方式调用:
private func createSiteMenu(actionTitle: String? = nil) {
let menu = UIMenu(title: "Site", image: nil, identifier: nil, options: [], children: siteMenuItems)
siteButton?.menu = updateActionState(actionTitle: actionTitle, menu: menu)
siteButton?.showsMenuAsPrimaryAction = true
}
谢谢,这解决了我的类似问题。我正在使用 ios15 弹出式菜单和下拉式菜单,但希望通过使用原始值作为菜单选项的枚举来填充菜单。
enum SortOrder: String, Codable, CaseIterable {
case name = "Name"
case category = "Category"
case qty = "Quantity"
case value = "Value"
case token = "Token"
}
let sortClosure = { [self] (action: UIAction) in
// closure actions based on self.sortOrderPopup.currentTitle!
}
var sortOrderPopupOptions: [UIAction] = []
for sortOption in ListLibrary.SortOrder.allCases {
sortOrderPopupOptions.append(UIAction(title: sortOption.rawValue, handler: sortClosure))
}
sortOrderPopup.menu = UIMenu(children: sortOrderPopupOptions)
menuSelection = currentList.sortOrder.rawValue
sortOrderPopup.menu = updateActionState(actionTitle: menuSelection, menu: sortOrderPopup.menu!)
您的解决方案工作完美,可以调整以修改菜单的其他属性!