Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在UIAction中手动更改选定的UIMenu?

如何在UIAction中手动更改选定的UIMenu?
EN

Stack Overflow用户
提问于 2021-11-02 10:54:32
回答 2查看 2.3K关注 0票数 5

的目标:试图创建一个过滤器选择屏幕(在卡片视图中),其中有带有UIMenu项的UIButtons。当我选择任何一个过滤器,并单击apply filters按钮时,我将关闭filter视图控制器并返回到集合视图屏幕,使用所选的筛选器刷新数据。

问题:当我想再次返回以更改任何过滤器时,我单击filters按钮打开filters视图控制器,但是显然没有任何UIMenu选择被保留,因为它们被重置为默认的第一个索引设置。

如何解决?:当将我的数据从filterVC传递回主列表屏幕时,我传递所选UIMenu的标题。我在想,我可以将它传递回filterVC,并将菜单默认为传入的数据(即。可以搜索标题并使其成为UIMenu中选定的UIMenu),但是我似乎找不到一种方法来手动选择哪个UIAction应该是UIMenu的选定状态!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    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()调用以下内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
func createSpaceTypeMenu() {
    spaceTypeButton?.menu = spaceTypeMenu
    spaceTypeButton?.showsMenuAsPrimaryAction = true
}

在选择了过滤器之后,我将它们传回以前的VC:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@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)
    }
}

站点、空间类型、持续时间都是UIbuttons,带有过滤器选项的UIMenu,这些选项目前只是像上面那样硬编码的。

我想要发生的是,如果我在调用applyFiltersButtonPressed()之前选择了“called”来解散VC,那么当我回到这个FiltersVC时,我希望“FiltersVC”仍然被选择为UIbutton中的文本,并且还希望在“办公桌”旁边加上勾号,而不希望菜单项默认为第一个选项,即“全部”。

希望这有意义吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-03 05:56:19

我自己找出了如何做到这一点,希望它能帮助和我一样穿着同样鞋子的人:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}

并可由下列组织调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
}
票数 6
EN

Stack Overflow用户

发布于 2021-11-28 12:25:49

谢谢,这个解决了我类似的问题。我使用的是ios15弹出菜单和下拉菜单,但希望通过枚举填充菜单,并将rawvalue作为菜单选项。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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!)

您的解决方案工作完美,可以调整以修改菜单的其他属性!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69815615

复制
相关文章
iOS17适配指南之UIMenu与UIAction
YungFan
2023/07/09
8360
iOS17适配指南之UIMenu与UIAction
iOS14开发-菜单
iPhone 11 之前,有一种主屏交互方式称之为 3D Touch,现在已经改为 Haptic Touch。 它是一种立体触控技术,可感应不同的触控压力。通过该技术可以给 App 设置最多 4 个不同的 ShortcutItem(快捷操作菜单),实现方式分为静态和动态两种。
YungFan
2021/11/24
8190
iOS16适配指南之UIMenu
UIMenu增加了属性preferredElementSize用于设置菜单显示时内部元素的尺寸,共有 3 种尺寸可选,分别为small、medium与large。
YungFan
2022/06/29
8700
iOS开发之UIMenu
iOS 14 中引入UIDeferredMenuElement,允许异步地创建 UIMenu,也就是说可以动态在后台配置菜单的内容。
YungFan
2020/07/28
1.8K0
iOS开发之UIMenu
iOS开发之Context Menus
iOS 13 以后,UITableView 和 UICollectionView 也支持 Context Menus,使用起来特别简单,只需要实现相应的代理方法,返回UIContextMenuConfiguration即可。
YungFan
2020/07/22
1.3K0
iOS16适配指南之UIEditMenuInteraction
iOS 16 中新增的菜单交互,用于取代 UIMenuController 与 UIMenuItem。 目前 UITextField 与 UITextView 已经默认支持。 // Created by YungFan import UIKit class ViewController: UIViewController { lazy var textField: UITextField = { let textField = UITextField(frame: CGRect(
YungFan
2022/08/23
1.5K0
iOS16适配指南之UINavigationItem
增加了类型为 UINavigationItem.ItemStyle 的属性style用于描述 UINavigationItem 在 UINavigationBar 上的布局,共有 3 种样式:navigator(默认样式),browser(浏览器样式)与editor(编辑器样式)。 // Created by YungFan import UIKit class ViewController: UIViewController { override func viewDidLoad() {
YungFan
2022/08/23
1.5K0
如何在Linux中更改SSH端口?
SSH(Secure Shell)是一种安全的远程登录协议,它允许您通过网络远程连接到Linux系统并进行管理操作。默认情况下,SSH使用22端口进行通信。然而,为了增强系统的安全性,有时候我们需要更改SSH端口,以减少潜在的攻击。
网络技术联盟站
2023/05/25
9.5K0
如何在Linux中更改SSH端口?
如何在 Linux 中更改主机名?
在 Linux 系统中,主机名是用于标识和区分网络上的不同计算机的名称。默认情况下,Linux 发行版会分配一个主机名给您的计算机,但是有时候您可能需要根据自己的需求更改主机名。在本文中,我们将详细介绍如何在 Linux 中更改主机名,以及更改主机名后可能涉及到的其他配置。
网络技术联盟站
2023/06/09
8.8K0
如何在 Linux 中更改主机名?
如何在 Linux 中更改 Nginx 80 端口?
Nginx 是一个开源的轻量级 Web 服务器替代 apache 来处理高流量的网站。
网络技术联盟站
2022/06/21
5.4K0
如何在 Linux 中更改 Nginx 80 端口?
如何在 Linux 中更改 Apache HTTP 端口?
Apache Web Server 是一个免费的开源跨平台 Web 服务器应用程序,用于通过 Internet 提供内容。
网络技术联盟站
2022/06/21
6.3K0
如何在 Linux 中更改 Apache HTTP 端口?
如何在Linux中更改用户ID?
在Linux系统中,每个用户都有一个唯一的用户ID(User ID),用于标识和管理用户的权限和资源访问。有时候,我们需要更改用户ID,可能是为了解决冲突、重组用户组或其他管理需求。本文将详细介绍如何在Linux中更改用户ID的几种方法。
网络技术联盟站
2023/06/08
8.4K0
如何在Linux中更改用户ID?
如何在 Linux 中更改默认 ssh 端口 22?
SSH 服务使用的标准端口是 22/TCP。但是,您可能希望更改 SSH 默认端口 22,以确保您的服务器尽可能安全,因为标准 22/TCP 端口一直是互联网上黑客和机器人程序漏洞的目标。
会长君
2023/04/25
4.4K0
如何在Linux中更改SSH远程登录端口
SSH:短于安全Shell,SSH(由SSH通信安全公司开发)是用于远程登录安全协议。 使用SSH客户端,用户可以连接到服务器以比其他方法(例如telnet)更安全的方式传输信息。到右侧的图像是SSH会话,它使用一个命令行界面,可如何外观的示例。 SSH默认为端口22。
星哥玩云
2022/07/29
3.7K0
如何在 Eclipse 中更改注释块的 @author 版权信息?
我们在使用 IDE——Ecilpse 进行开发,需要注明版权信息的时候,如果不更改默认设置的话,在注释块 @author 的内容就是电脑系统默认的,例如下图所示。为了开发方便就需要进行修改。
白鹿第一帅
2021/03/02
4.5K0
如何在 Eclipse 中更改注释块的 @author 版权信息?
iOS17适配指南
YungFan
2023/07/09
2.3K0
点击加载更多

相似问题

如何在运行时更改UIAction在UIMenu中的状态?

423

iOS 13.0 UIMenu和UIAction for UIContextMenuConfiguration

32

如何在UIAction中改变UIMenu中的图标颜色?

14

如何改变文本和背景色UIMenu \\ UIAction (Swift 5)

18

在swift中更改UImenu的位置

313
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文