使用PasteBoard中的更改进行.contextMenu更新

时间:2020-10-27 20:23:50

标签: swiftui

对于这样的视图,我有一个contextMenu视图修饰符:

Text("Some Text")
.contextMenu {
    Button(action: {
        editCodes(withTappedCode: codeOnDisplay, delete: true)
    }, label: {
         Text("Paste")
         Image(systemName: "doc.on.clipboard")
    })
    .disabled(!UIPasteboard.general.contains(pasteboardTypes: [aPAsteBoardType]))
}

仅当特定的“粘贴板类型”可用时,才应启用该按钮。但是,这不会发生。

当按钮的上下文菜单首次显示时,将设置为禁用状态。此后,即使关闭并再次打开菜单,对粘贴板的任何更改也不会修改禁用状态。

这似乎只有在以任何方式刷新修改后的视图时才会发生。

如何使用“粘贴板”类型更改上下文菜单按钮的禁用状态?

1 个答案:

答案 0 :(得分:0)

您可以收听UIPasteboard.changedNotification来检测更改并刷新视图:

struct ContentView: View {
    @State private var pasteDisabled = false

    var body: some View {
        Text("Some Text")
            .contextMenu {
                Button(action: {}) {
                    Text("Paste")
                    Image(systemName: "doc.on.clipboard")
                }
                .disabled(pasteDisabled)
            }
            .onReceive(NotificationCenter.default.publisher(for: UIPasteboard.changedNotification)) { _ in
                pasteDisabled = !UIPasteboard.general.contains(pasteboardTypes: [aPAsteBoardType])
            }
    }
}

(您可能还想使用UIPasteboard.removedNotification)。