Я создал этот пример, демонстрирующий проблему, с которой я столкнулся с моим приложением. У меня есть представление со свойством, которое родительское представление и само должны использовать для обновления пользовательского интерфейса. Что происходит, так это то, что дочернее представление обновляется, когда свойство изменяется, а родительское представление - нет.
Я пытаюсь достичь с помощью приведенного ниже кода, так как при нажатии на текст появляется синий контур, если состояние истинно, в противном случае нет контура. Что на самом деле происходит, так это то, что дочернее представление обновляется (изменяется текст), но родительское представление остается прежним (синий контур остается прежним).
/********************Child View***************************/
class ExampleChildViewModel: ObservableObject {
var id = UUID()
@Published var showOptions: Bool
init( _ show: Bool ) {
showOptions = show
}
}
struct ExampleChildView: View {
@ObservedObject var model: ExampleChildViewModel
var body: some View{
Text("\(String(model.showOptions))")
.onTapGesture {
self.model.showOptions.toggle()
}
}
}
/********************Parent View***************************/
class ExampleParentViewModel: ObservableObject {
@Published var children = [ExampleChildViewModel]()
init(){
children.append( ExampleChildViewModel( true ) )
children.append( ExampleChildViewModel( false ) )
}
}
struct ExampleParentView: View {
@ObservedObject var parent: ExampleParentViewModel
var body: some View{
VStack{
ForEach( parent.children, id: \.id ){ m in
ExampleChildView( model: m )
.frame(width: 60, height: 30)
.overlay(
RoundedRectangle(cornerRadius: 6)
.stroke(Color.blue, lineWidth: 3)
.opacity((m.showOptions) ? 1 : 0) // <---- Doesn't update
)
}
}
}
}
/********************Main View*******************************/
struct ExampleView: View {
@ObservedObject var model = ExampleParentViewModel()
var body: some View {
VStack{
ExampleParentView( parent: model )
}
}
}
Почему parent
в ExampleParentView
не обновляется, когда showOptions
в ExampleChildViewModel
установлено?
Изменить:
Это то, что приложение пытается показать / скрыть. Каждая из строк с символами блокировки является дочерними представлениями.

If I have the overlay in the child view I end up with the following
Дочерний оверлей оказывается позади других представлений