Форма SwiftUI не обновляется

#swift #swiftui

#swift #swiftui

Вопрос:

В ZStack у меня есть ForEach цикл для вставки некоторых фигур SkinShape :

 Struct Canvas: View {
    @ObservedObject var glyphModel: GDGlyphViewModel
    @Binding var tool: GDEditorTool
    @Binding var selectedObject: UUID?

    var body: some View {
    ScrollView([.vertical, .horizontal], showsIndicators: true) {
        GeometryReader { geometry in
            ZStack {
                mouseReader(geometry: geometry)
        
                ForEach(glyphModel.glyph?.originControls ?? []) { control in
                    SkinShape(control: control).stroke()
                }
                ForEach(glyphModel.positionBinders.indices, id:.self) { index in
                    PointShape(point: position(index))
                        .foregroundColor( isSelected(index: index)
                        ? .blue : .gray)
                        .....
 

И снаружи:

 struct SkinShape: Shape  {
    @State var control : GDOriginControl
    func path(in rect: CGRect) -> Path {
        return Path { path in
            print ("Making Shape (control.id)")
            for index in 0..<control.origin.sticks.count-1 {
                print (control.origin.sticks[index].offset.cgPoint)
                let this = control.origin.sticks[index].offset.cgPoint
                path.move(to: control.point.cgPoint   this)
                let next  = control.origin.sticks[(index 1)].offset.cgPoint
                path.addLine(to: control.point.cgPoint   next)
            }
        }
    }
}
 

Но форма никогда не меняется во время перерисовки. В консоли я вижу числовые изменения, все, кроме SkinShape обновленного, glyphModel.objectWillChange.send() запускается с помощью перетаскивания, я могу перемещать точки и изменять данные формы. Но формы никогда не меняются, обновляются только при замене содержимого GDGlyphViewModel . Как заставить эти фигуры читать их данные и перерисовывать?

Ответ №1:

Вам не нужна оболочка состояния в форме (она не изменяется внутри, но предотвращает изменения извне):

 struct SkinShape: Shape  {
    var control : GDOriginControl     // << no state here !!
// .. other code
}