我正在嘗試.contextMenu使用切換Bool值的按鈕設定 SwiftUI 。背景關系選單的按鈕文本應該在切換時更改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")
}
}
}
}
}
}
uj5u.com熱心網友回復:
這是 SwiftUI 中的一個錯誤,在 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)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/370557.html
標籤:迅速 迅捷 上下文菜单 swiftui-上下文菜单
上一篇:在滾動視圖中獲取視圖中的物件位置
