SwiftUI - 通过 ContextMenu 呈现模态

Posted

技术标签:

【中文标题】SwiftUI - 通过 ContextMenu 呈现模态【英文标题】:SwiftUI - Present Modal via ContextMenu 【发布时间】:2020-02-28 08:56:31 【问题描述】:

我目前正在尝试通过按下上下文菜单中的按钮来呈现模式视图。这可行,但是应该显示模态视图的代码被调用了两次,这是一个问题,因为我正在调用一些网络请求。

这是我目前的演示项目(没有网络内容):

这是应用启动时调用的视图。

struct ContentView: View 
    @State var isModal: Bool = false

    var body: some View 
        Group 
            Text("Main view")
        .contextMenu 
            Button("Present Detail")  self.isModal = true .sheet(isPresented: $isModal) 
                DetailView()
            
        
    

这是简单的细节视图

struct DetailView: View 
    var body: some View 
        Text("Detail View")
    

因此,如果我在 DetailView() 被实例化的行放置一个断点,我会看到这部分被调用了两次。是否有更好的解决方案来呈现模态视图,而无需多次实例化?

【问题讨论】:

【参考方案1】:

改为使用

var body: some View 
    Group 
        Text("Main view")
    .contextMenu 
        Button("Present Detail")  self.isModal = true 
    .sheet(isPresented: $isModal) 
        DetailView()
    

【讨论】:

这不会改变我的情况,DetailView() 也被调用了两次。断点被调用两次。你不也是这样吗? @patrickS,嗯..你是对的。但正如我所见,DetailView.init() 以任何方式被调用了两次,.sheet 被激活。它不依赖于.contextMenu 你能解决这个问题吗?我现在也有同样的问题 嗯.. 刚刚用 Xcode 12.1 / ios 14.1 重新测试,DetailView.init 只被调用一次。

以上是关于SwiftUI - 通过 ContextMenu 呈现模态的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:是不是可以使用 ForEach + ContextMenu + if 语句?

删除 SwiftUI 中 NavigationLink 上 ContextMenu 的模糊预览

如何在 SwiftUI 中将 DatePicker 放入 ContextMenu

SwiftUI 检测 contextMenu 何时打开

macOS App SwiftUI 中的 ContextMenu 按钮点击

圆形 LinearGradient 上的 ContextMenu 在 SwiftUI 中产生锐利的边缘