ios - 为什么 SwiftUI 上下文菜单在预览中显示所有行 View ?

标签 ios swiftui contextmenu swiftui-list

我在列表行中有一个复杂的 View :

var body: some View {
        VStack {
            VStack {
                FullWidthImageView(ad)

                HStack {
                    Text("\(self.price) \(self.ad.currency!)")
                            .font(.headline)
                    Spacer()
                    SwiftUI.Image(systemName: "heart")
                }
                        .padding([.top, .leading, .trailing], 10.0)

在哪里 FullWidthImageView是定义了 contexMenu 修饰符的 View 。
但是当我长按图像时,我看到的不是预览中的唯一图像,而是所有行 View 。




任何元素上都没有其他 contextMenu。

如何仅在图像上下文中进行预览?

UPD。 Here是说明问题的简单代码

最佳答案

我们不知道为什么在您的情况下它不起作用,直到我们看到您的 FullWidthImageView 以及您如何构建上下文菜单。 Asperi 的答案是工作示例,并且做得正确! 但这真的解释了你的麻烦吗?

问题是在申请 .contextMenu 时仅对 View 的某些部分进行修饰符(如您的示例中),我们必须小心。

让我们看一些例子。

import SwiftUI

struct FullWidthImageView: View {
    @ObservedObject var model = modelStore
    var body: some View {
        VStack {
            Image(systemName: model.toggle ? "pencil.and.outline" : "trash")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 200)
        }.contextMenu(ContextMenu {
            Button(action: {
                self.model.toggle.toggle()
            }) {
                HStack {
                    Text("toggle image to?")
                    Image(systemName: model.toggle ? "trash" : "pencil.and.outline")
                }
            }
            Button("No") {}
        })
    }
}

class Model:ObservableObject {
    @Published var toggle = false
}

let modelStore = Model()

struct ContentView: View {
    @ObservedObject var model = modelStore
    var body: some View {
        VStack {
            FullWidthImageView()
            Text("Long press the image to change it").bold()
        }
    }
}
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

运行时, “上下文菜单”修改后的 View 似乎是“静态的” !

enter image description here

是的,在长按时,您会看到垃圾图像,即使它在您关闭上下文 View 时已正确更新。 在每次长按时,您只会看到垃圾!

如何让它动态化?我需要图像与我的“主视图!
这里有 .id修饰符 .来看看有什么区别!

首先我们必须更新我们的模型
class Model:ObservableObject {
    @Published var toggle = false
    var id: UUID {
        UUID()
    }
}

接下来是我们的 View
FullWidthImageView().id(model.id)

现在它按我们的预期工作。
enter image description here

再举一个例子,“标准”状态/绑定(bind)根本不起作用检查SwiftUI hierarchical Picker with dynamic data crashes

更新

作为临时解决方法,您可以通过 ScrollView 模仿 List
import SwiftUI

struct Row: View {
    let i:Int
    var body: some View {
        VStack {
            Image(systemName: "trash")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 200)
                .contextMenu(ContextMenu {
                    Button("A") {}
                    Button("B") {}
                })
            Text("I don’t want to show in preview because I don’t have context menu modifire").bold()
        }.padding()
    }
}

struct ContentView: View {
    var body: some View {
        VStack {
            ScrollView {
                ForEach(0 ..< 20) { (i) in
                    VStack {
                        Divider()
                        Row(i: i)
                    }
                }
            }
        }
    }
}

它不是最佳的,但在你的情况下它应该可以工作
enter image description here
enter image description here

关于ios - 为什么 SwiftUI 上下文菜单在预览中显示所有行 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60114545/

相关文章:

ios - 使 TabView 在 SwiftUI 上不透明会在顶部产生一个新 View

java - 如何在Java中的Windows资源管理器中获取文件右键单击菜单

java - Android 中的上下文菜单

android - 如何从上下文菜单获取有关 RecyclerView 项目的信息

objective-c - 高级 iPad 编程

ios - Swift:为多个设备对齐元素

SwiftUI - 当第 1 个 DetailView 使用 navigationView 返回 MasterView 时如何自动推送第 2 个 DetailView

ios - SwiftUI - 列表编辑模式 - 如何更改删除按钮标题?

ios - 组合 UIView 以创建复杂 View 的最佳方法?

objective-c - 如何找到无意的对象指针比较?