如何在 SwiftUI 中显示选定的菜单项?

Posted

技术标签:

【中文标题】如何在 SwiftUI 中显示选定的菜单项?【英文标题】:How to display the selected menu item in SwiftUI? 【发布时间】:2021-02-12 10:57:04 【问题描述】:

我想在用户稍后回来时显示并保存所选菜单。我当前的代码只显示选定的项目,但当我关闭工作表并返回时没有保存。


  @State var selectedAge: Int = .zero
  
  var body: some View 
    Menu 
      ForEach(myViewModel.MyModel.selectAge.indices, id: \.self)  indice in
        Button(action: 
          selectedAge = indice
        ) 
          if selectedAge == indice 
            Text("\(myViewModel.MyModel.selectAge[indice])")
          
          else 
            Text("")
          
        
      
     label: 
      Text("\(myViewModel.MyModel.selectAge[selectedAge])")
    
  

此代码来自我的模型

var selectedAge: [String] = ["12", "15", "18", "21", "24"]

请指导我解决这个问题。

【问题讨论】:

基本上可以将selectedAge存储在UserDefaults中。 是的,我已经实现了用户默认设置,并且它适用于其他步进器、选择器小部件。但它不仅适用于菜单。 能否请您使用 UserDefaults 版本编辑您的问题,我们可以看到您做错了什么,因为您需要的只是持久性。 我认为,由于@state,当用户关闭并再次打开时,它被替换为 .zero (第一个索引 [“12”])。会是这个原因吗? 没错,这就是我要说的......您没有保留任何 selectedAge,因此当您打开该菜单时,您会看到 selectedAge 数组的第一项。你也可以使用@AppStorage。 【参考方案1】:

我使用此代码解决了我的问题。感谢其他花时间帮助我的开发者!

                        Menu
                            ForEach(myViewModel.myModel.selectAge, id: \.self) index in
                                Button(action : 
                                    myViewModel.myModel.selectAge = "\(index)"
                                ) 
                                    if myViewModel.myModel.selectedAge == index
                                        Label("\(index)", systemImage: "checkmark")
                                    else 
                                        Text("\(index)")
                                    
                                
                                
                                
                            
                         label: 
                            Text("\(myViewModel.myModel.selectedAge)")
                        

这是插入到我的模型中

var selectedAge = "12"
var selectedAge: [String] = ["12", "15", "18", "21", "24"]

【讨论】:

【参考方案2】:

试试这个:

// selectedAge1 数组列表替换为您的数据模型列表...

import Combine

class MenuAgeSettings: ObservableObject 
    @Published var selectedAge: String 
        didSet 
            UserDefaults.standard.set(selectedAge, forKey: "selectedAge")
        
    
    
    init() 
        self.selectedAge = UserDefaults.standard.object(forKey: "selectedAge") as? String ?? ""
    


struct MenuView: View 
    var selectedAge1: [String] = ["12", "15", "18", "21","24"]
    
    @ObservedObject var menuSettings = MenuAgeSettings()
        
    var body: some View 
       Menu
          ForEach(self.selectedAge1.indices, id: \.self) indice in
              let text = self.selectedAge1[indice]
               Button(action : 
                   menuSettings.selectedAge = text
               ) 
                if menuSettings.selectedAge == text 
                      Label(text, systemImage: "checkmark")
                    else 
                      Text(text)
                   
               
           
         label: 
            if menuSettings.selectedAge.isEmpty 
                Text(selectedAge1[.zero])
             else 
                Text(menuSettings.selectedAge)
            
        
    

【讨论】:

它正在被检查,但是当我再次关闭并打开屏幕时,它被重置为数组的第一个索引

以上是关于如何在 SwiftUI 中显示选定的菜单项?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中激活/停用菜单项

如何在 WPF 中获取“选定的菜单项”

SDI-通过选定的弹出菜单项显示对话框

BottomNavigationView - 如何获取选定的菜单项?

SwiftUI:如何在 macOS 应用程序中实现编辑菜单

菜单栏中的选定项