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 тем, что вам нравится