繁体   English   中英

关闭自定义模式/覆盖不更新 SwiftUI 中的视图内容

[英]Dismissing custom modal / overlay not updating contents of View In SwiftUI

更新:我对其进行了一些重构以使用@ObservableObject ,但问题仍然存在

在我的 SwiftUI 应用程序中,我有一个LazyVGrid填充了n卡和一个新事件按钮。 当我按下新事件按钮时,我有一个覆盖视图的自定义模式,让用户添加一个新事件。 但是,在关闭视图后(通过点击Create Event按钮),模式消失了,但是新的事件卡并没有添加到LazyVGrid中。 只有在我强制退出应用程序并重新打开它时才会出现。

这是主要的ContentView

struct ContentView: View {
    @State var progress: Double = 0.0
    @State var editMode: Bool = false
    @State var angle: Double = 0
    @State var showModal: Bool = false

    @ObservedObject var model: Model
            
    var columns: [GridItem] = Array(repeating: GridItem(.flexible(), spacing: 10), count: 2)
    
    func animate(while condition: Bool) {
        self.angle = condition ? -0.6 : 0
        
        withAnimation(Animation.linear(duration: 0.125).repeatForever(while: condition)) {
            self.angle = 0.6
        }
        
        if !condition {
            self.angle = 0
        }
    }
    
    var body: some View {
        ZStack {
            NavigationView {
                LazyVGrid(columns: columns, spacing: 10) {
                    ForEach(model.events, id: \.self) { event in
                        SmallCardView(event: event, angle: $angle)
                    }
                    
                    if !showModal {
                        AddEventButtonView(
                            editMode: $editMode,
                            showModal: $showModal,
                            namespace: namespace
                        )
                    } else {
                        Spacer().frame(height: 100)
                    }
                }
                .onLongPressGesture {
                    if !self.editMode {
                        self.editMode = true
                        animate(while: self.editMode)
                    }
                }
            }
            
            if self.showModal {
                AddEventView(namespace: namespace, events: self.$model.events, showModal: $showModal)
            }
            
        }
    }
}

这是添加事件按钮的视图:

struct AddEventButtonView: View {
    @Binding var editMode: Bool
    @Binding var showModal: Bool
    
    var namespace: Namespace.ID

    var body: some View {
        Image(systemName: "calendar.badge.plus")
            .frame(height: 100)
            .frame(maxWidth: .infinity)
            .opacity(self.editMode ? 0.0 : 1.0)
            .onTapGesture {
                withAnimation {
                    self.showModal = true
                }
            }
    }
}

这是我的模态视图:

struct AddEventView: View {
    @State var eventName: String = ""
    @State var endDate = Date()
    @State var gradientIndex: Int = 0
    
    @Binding var showModal: Bool
    @Binding var events: [Event]
    
    var namespace: Namespace.ID
    
    init(namespace: Namespace.ID, events: Binding<[Event]>, showModal: Binding<Bool>) {
        self.namespace = namespace
        self._events = events
        self._showModal = showModal
    }
    
    var body: some View {
        VStack(spacing: 30.0) {
            //...
                        
            Button(action: {
                let event = Event(name: eventName, start: .init(), end: endDate, gradientIndex: gradientIndex)
                
                self.events.append(event)
                
                withAnimation {
                    self.showModal = false
                }
            }) {
                RoundedRectangle(cornerRadius: 13)
                    .frame(maxWidth: .infinity)
                    .frame(height: 42)
                    .overlay(
                        Text("Add Event")
                            .foregroundColor(.white)
                            .bold()
                    )
            }
            .disabled(self.eventName.isEmpty)
        }
    }

}

如果有人知道如何更新 LazyVGrid 以在添加新事件时显示新事件卡,那就太棒了,谢谢!

这是问题所在:

在此处输入图像描述

目前尚不清楚您是如何设置model的,但应该注意更新视图,因为(scratchy)

struct ContentView: View {
    @State var progress: Double = 0.0
    @State var editMode: Bool = false
    @State var angle: Double = 0
    @State var showModal: Bool = false

    @ObservedObject var model: Model       // << here !!

...

或通过.environmentObject使用@EnvironmentObject模式进行注入

或用于 Swift 2.0 使用

@StateObject var model: Model = Model.shared

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM