SwiftUI — открыть лист с разных точек зрения

Вот у меня такой лист

            .sheet(item: $logMyPractice, content: { item in
          AssesmentRecorderView(
            assessment: DrillModel(
              questions: [
                .init(prompt: "Question 1", resultValue: .integer),
              ]
            ),
            completion: { date, answers in
              print("response", date, answers)
              // custom logic, save in the db
            })
          .presentationDetents([.fraction(0.85), .large ])
        }

Происходит то, что мне нужно открыть этот лист с разных точек зрения. Я мог бы скопировать/вставить его в отдельные виды, но он не соответствуетDRYконцепция.

я мог бы создатьObservableObjectв главном представлении, содержащем информацию о листе, и прикрепите его какenvironmentObject, но мне интересно, есть ли лучший подход?

1 ответ

А вот и сила ViewModifier

Вы можете сделать что-то вроде этого

          struct ContentView: View {
    
    @State var isPresented: Bool = false
    
    var body: some View {
        VStack {
            Image(systemName: "globe")
                .imageScale(.large)
                .foregroundColor(.accentColor)
            Button {
                isPresented = true
            } label: {
                Text("Hello, world!")
            }

        }
        .customSheet(isPresented: $isPresented) { singleString, arrayString in
            print(singleString)
            print(arrayString)
        }
    }
 }
    
    struct CustomSheetViewModifier: ViewModifier {
        
        @Binding var isPresented: Bool
        
        let completionHandler: ((String, [String]) -> Void)?
        
        func body(content: Content) -> some View {
            content
                .sheet(isPresented: $isPresented) {
                    Button {
                        completionHandler?("Done", ["Button 1", "Button 2"])
                        isPresented = false
                    } label: {
                        Text("Click me")
                    }
    
                }
        }
    }

extension View {
    func customSheet(isPresented: Binding<Bool>, completionHandler: ((String, [String]) -> Void)?) -> some View {
        modifier(CustomSheetViewModifier(isPresented: isPresented, completionHandler: completionHandler))
    }
}

и в вашем случае вы замените тело CustomeSheetViewModifier на это

      func body(content: Content) -> some View {
        content
            .sheet(isPresented: $isPresented) {
                AssesmentRecorderView(
                    assessment: DrillModel(
                        questions: [
                            .init(prompt: "Question 1", resultValue: .integer),
                        ]
                    ),
                    completion: { date, answers in
                        completionHandler(date, answers)
                    })
                .presentationDetents([.fraction(0.85), .large ])
            }
    }

предполагая, что дата является строкой, а ответы представляют собой массив строк, вы, конечно, можете заменить параметры завершенияHandler тем, что вам нравится

Другие вопросы по тегам