首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在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

复制
相关文章

相似问题

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