手动改变Uimenu内所选择的UIAction?

目标:测试筛选筛选屏幕(在卡片视图中),其中包含UIMEnu项目的UIBUTONS。当我选择任何过滤器时,然后单击“应用过滤器”按钮,我解除筛选器视图控制器,然后返回收集视图屏幕,以刷新所选过滤器的数据。

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

如何解决?:从FilterVC转回主列表屏幕时,我通过所选Uenenu的标题。我在认为我可以将此传递回RESSVC并默认到数据中的菜单(即,可以搜索标题并使其在UIMENU中选择所选的UIACORT),但我似乎无法找到一种方法手动选择哪个UIAction应该是UIMENU的选定状态!

    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
}

选中过滤器后,我将它们传递回上一个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的所有UIBUTON用于默认的滤波器,这是默认的,这是目前如上所述的。

我想要发生的是,如果我在ApplyFiltersButton Butture()之前选择“桌子”,则被调用以解雇VC,我返回此FiltersVC时,我希望“桌子”仍然被选为Uibutton中的文本。希望勾选到“桌子”旁边,不要希望菜单项默认回到“全部”的第一个选项。

希望有意义?

回答 2

  1. 赞同 0

    发现了如何自己做到这一点,希望它可以帮助他在同一只鞋子里的别人:

    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
    }
    

    Gamedev
  2. 赞同 0

    谢谢,这努力解决我的类似问题。我正在使用iOS15弹出窗口和下拉菜单,但希望使用RawValues枚举填充的菜单作为菜单选项。

    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!)
    

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

    TSON2095