【问题标题】:Context Menu not updating in SwiftUISwiftUI 中的上下文菜单未更新
【发布时间】:2021-11-29 18:15:20
【问题描述】:

我正在尝试设置一个 SwiftUI .contextMenu,它带有一个可以切换 Bool 值的按钮。当Bool 切换时,上下文菜单的按钮文本应该会发生变化。但是上下文菜单不会更新。有没有办法强制更新上下文菜单?

描述问题的示例代码:

import SwiftUI

struct Item: Identifiable {
    let id = UUID()
    let user: String
    var active: Bool
}

struct ContentView: View {
    @State var items: [Item] = [
        Item(user: "Daniel",active: false),
        Item(user: "Jack", active: true),
        Item(user: "John", active: true)
    ]
    
    @State var isOn : Bool = false
    var body: some View {
        List {
            ForEach(items) { item in
                VStack {
                    Text("\(item.user)")
                        
                    HStack {
                        Text("Active ? ")
                        Text(item.active ? "YES": "NO")
                    }
                }.contextMenu{
                    Button(action: {
                        let index = items.firstIndex{$0.user == item.user}
                        
                        items[index!].active.toggle()
                    }) {
                        Text(item.active ? "Set as Active": "Set as Inactive")
                    }
                }
            }
        }
    }
}

【问题讨论】:

    标签: swift swiftui contextmenu swiftui-contextmenu


    【解决方案1】:

    这是SwiftUI中的一个bug,在Xcode 13.2 beta 2的模拟器中还是坏掉了。

    我设法通过在if item.active 语句的两个分支中复制列表项来解决它,如下所示:

    struct ContentView: View {
        @State var items: [Item] = [
            Item(user: "Daniel",active: false),
            Item(user: "Jack", active: true),
            Item(user: "John", active: true)
        ]
    
        var body: some View {
            List {
                ForEach(items) { item in
                    // work around SwiftUI bug where
                    // context menu doesn't update
                    if item.active { listItem(for: item) }
                    else { listItem(for: item) }
                }
            }
        }
    
        private func listItem(for item: Item) -> some View {
            VStack {
                Text("\(item.user)")
    
                HStack {
                    Text("Active ? ")
                    Text(item.active ? "YES": "NO")
                }
            }
            .contextMenu {
                Button(item.active ? "Deactivate" : "Activate") {
                    if let index = items.firstIndex(where: { $0.id == item.id }) {
                        items[index].active.toggle()
                    }
                }
            }
            .id(item.id)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 2022-12-28
      • 1970-01-01
      • 2020-08-14
      相关资源
      最近更新 更多