ios 如何创建一个既返回视图又返回操作的视图修改器?

olhwl3o2  于 2023-02-26  发布在  iOS
关注(0)|答案(1)|浏览(159)

我已经创建了一个视图修改器和一个图纸管理器一起来处理和创建整个项目中的弹出视图。它与一个简单的弹出窗口和一个关闭按钮一起完美地工作来关闭视图。现在我正在尝试为这个图纸管理器和修改器添加更多的功能,这样我就可以创建/使用更强大的自定义弹出窗口。我的意思是能够在这些弹出窗口上使用按钮和它们的操作。
视图修改符代码

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传播的,它在视图修改器中被调用。

t98cgbkg

t98cgbkg1#

func popup(with sheetManager: SheetManager, action: @escaping () -> Void) -> some View {
        self.modifier(PopupViewModifier(sheetManager: sheetManager){  action() })
    }

action()从未使用过,只需要在函数中调用即可

相关问题