我已经创建了一个视图修改器和一个图纸管理器一起来处理和创建整个项目中的弹出视图。它与一个简单的弹出窗口和一个关闭按钮一起完美地工作来关闭视图。现在我正在尝试为这个图纸管理器和修改器添加更多的功能,这样我就可以创建/使用更强大的自定义弹出窗口。我的意思是能够在这些弹出窗口上使用按钮和它们的操作。
视图修改符代码
func popup(with sheetManager: SheetManager, action: @escaping () -> Void) -> some View {
self.modifier(PopupViewModifier(sheetManager: sheetManager){ })
}
正在调用的函数/视图
struct PopupViewModifier: ViewModifier {
@ObservedObject var sheetManager: SheetManager
var popupAction: () -> (Void)
func body(content: Content) -> some View {
content
.disabled(sheetManager.action.isPresented ? true : false )
.blur(radius: sheetManager.action.isPresented ? 05 : 0)
.overlay(alignment: .center) {
if case let .present(config) = sheetManager.action {
switch config.type {
case .popupAlert:
PopupView(config: config) {
withAnimation {
sheetManager.dismiss()
}
}
case .soundProfileList:
SoundProfilePopupView(config: config) {
withAnimation {
sheetManager.dismiss()
}
} tappedProfile: {
popupAction()
}
}
}
}
.ignoresSafeArea()
}
}
以及如何在主视图中调用它,在主视图中,我试图获得操作回调
@EnvironmentObject var sheetManager: SheetManager
var body: some View {
buttonToCallPopup( didPress: {
sheetManager.present(with: Config.innit)
}) {
Text("Open up popup")
}
.popup(with: sheetManager) {
print("button from popup has been pressed")
}
}
图纸管理器代码
enum SheetType {
case popupAlert
case soundProfileList
}
final class SheetManager: ObservableObject {
typealias Config = Action.Info
@Published private(set) var action: Action = .na
enum Action {
struct Info {
let systemName: String
let title: String
let content: String
let type: SheetType
}
case na
case present(info: Info)
case dismiss
}
func present(with config: Config) {
guard !action.isPresented else { return }
self.action = .present(info: config)
}
func dismiss() {
self.action = .dismiss
}
}
extension SheetManager.Action {
var isPresented: Bool {
guard case .present(_) = self else {return false}
return true
}
}
我试过创建一个Void和View的类型别名,这样popup就可以返回它,我还试过让popup返回一个闭包,这样我就可以调用
.popup(with: sheetManager) { // action I want taken on the button of the popup view
}
但我只遇到了构建错误,没有任何操作。它花了一段时间来减少错误,但仍然没有任何操作。我想从.popup完成的操作是我想从tappedProfile传播的,它在视图修改器中被调用。
1条答案
按热度按时间t98cgbkg1#
action()从未使用过,只需要在函数中调用即可