swift 单元格和sheetView中的Menu行为异常

9o685dep  于 2023-01-25  发布在  Swift
关注(0)|答案(1)|浏览(107)

bounty将在6天后过期。回答此问题可获得+50的声誉奖励。AdR正在寻找来自声誉良好来源的答案

我想在列表的单元格中添加Menu,但当我打开工作表视图时,这会导致奇怪的行为。我得到以下消息:
[演示]尝试演示〈* TtGC7SwiftUI29演示主机控制器VS_7任意视图 :0x1620b0800〉位于〈 TtGC7快速UI19UI托管控制器GVS_15修改的内容VS_7任何视图VS_12根修改符 _:0x161811800〉(来自〈 TtGC7快速UI19UI托管控制器GVS_15修改内容VS_7任何视图VS_12根修改符 *_:0x161811800〉),该控件已经显示〈_UIContextMenuActionsOnly视图控制器:0x16051de40〉中指定的地址。
我觉得工作表视图想和菜单同时打开。我该如何解决这个问题?
下面是说明我的问题的示例代码:

struct Item: Identifiable{
let id: Int
let marque: String
let reference: String
}

struct ContentView: View {
    @State var items = [Item(id: 1, marque: "Schneider", reference: "123333"),     Item(id: 2, marque: "Siemens", reference: "1234444"), Item(id: 3, marque: "Beck", reference: "1233"), Item(id: 4, marque: "Aron", reference: "133449")]
    @State private var selectedItem: Item?

var body: some View {
    List {
        ForEach(items, id: \.id) { item in
            HStack {
                Text(item.marque)
                Spacer()
                Menu(content: {
                    Button("Edit") {}
                    Button("Delete") {}
                }, label: {
                    Image(systemName: "ellipsis.circle")
                })
            }
            .onTapGesture {
                self.selectedItem = item
            }
        }
    }
    .sheet(item: $selectedItem) { item in
        VStack{
            Text(item.marque)
            Text(item.reference)
        }
    }
}
}
but5z9lq

but5z9lq1#

是,工作表尝试与菜单同时显示,因为HStack上有TapGestureHStack包含rowMenu
幕后发生了什么?:-
1.当我们点击椭圆(Menu)时,SwiftUI将尝试显示菜单。
1.但是,由于我们也有Tap Gesture超过Row,它将更新selectedItem到项目。
1.当selectedItem更新时,由于它绑定到工作表,SwiftUI也将尝试呈现工作表。
1.并且在控制台中打印错误日志:“Attempt to present which is already presenting”。它告诉你,作为Self,它已经呈现了一个Menu,因此不能呈现工作表。
为了解决这个问题,我们来更新我们的视图树。我们将保持文本和菜单在不同的堆栈,只添加手势到文本(Row)。

List {
    ForEach(items, id: \.id) { item in
        HStack {
            HStack {
                Text(item.marque)
                Spacer()
            }
            .contentShape(Rectangle())
            .onTapGesture {
                self.selectedItem = item
            }

            Menu(content: {
                Button("Edit") {}
                Button("Delete") {}
            }, label: {
                Image(systemName: "ellipsis.circle")
            })
        }
    }
}
.sheet(item: $selectedItem) { item in
    VStack{
        Text(item.marque)
        Text(item.reference)
    }
}

这样点击Menu将不会更新selectedItem属性。

相关问题