Мы понятия не имеем, почему в вашем случае это не работает, пока мы не увидим ваш FullWidthImageView и то, как вы создаете контекстное меню. Ответ Аспери - это рабочий пример, и все сделано правильно! Но действительно ли это объяснило вашу проблему?
Проблема в том, что при применении модификатора .contextMenu
только к некоторой части вашего представления (как в вашем примере) мы должны быть осторожны.
Давайте посмотрим на какой-нибудь пример.
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()
}
}
во время работы вид измененного "контекстного меню" кажется "статическим"!
![введите здесь описание изображения](https://i.stack.imgur.com/9pDRN.gif)
Да, при длительном нажатии вы видите изображение корзины, даже если оно правильно обновляется, когда вы закрываете контекстное представление. При каждом долгом нажатии отображается только корзина!
Как сделать его динамичным? Мне нужно, чтобы изображение было таким же, как на моем «основном просмотре!» Здесь есть модификатор .id
. Посмотрим на разницу!
Сначала нам нужно обновить нашу модель
class Model:ObservableObject {
@Published var toggle = false
var id: UUID {
UUID()
}
}
и далее наш View
FullWidthImageView().id(model.id)
Теперь все работает так, как мы и ожидали. ![введите здесь описание изображения](https://i.stack.imgur.com/kQYyn.gif)
В качестве другого примера, когда "стандартное" состояние / привязка просто не работает, проверьте SwiftUI иерархический выбор со сбоем динамических данных
ОБНОВЛЕНИЕ
В качестве временного обходного пути вы можете имитировать List с помощью ScrollView
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)
}
}
}
}
}
}
Это не оптимально, но в вашем случае должно работать
![введите описание изображения здесь]( https://i.stack.imgur.com/3StGl.png )
person
user3441734
schedule
07.02.2020