0

カスタム ビュー拡張機能を作成して、機能を拡張.alertし、ニーズに合わせて多数のカスタマイズを追加しました。

import SwiftUI

extension View {
    
    public func alertX(isPresented: Binding<Bool>, content: () -> AlertX) -> some View {
        
        let alertX_view = AlertX_View(visible: isPresented, alertX: content())
        let alertXVC = AlertXViewController(alertX_view: alertX_view, isPresented: isPresented)
        alertXVC.modalPresentationStyle = .overCurrentContext
        alertXVC.view.backgroundColor = UIColor.clear
        alertXVC.modalTransitionStyle = .crossDissolve
        
        if isPresented.wrappedValue == true {
            if AlertX_View.currentAlertXVCReference == nil {
                AlertX_View.currentAlertXVCReference = alertXVC
            }
            
            let viewController = self.topViewController()
            viewController?.present(alertXVC, animated: true, completion: nil)
        } else {
            alertXVC.dismiss(animated: true, completion: nil)
        }
        
        return self
    }
    ... truncated for brevity
}

.alert が呼び出されるのと同じ方法で、ビューで呼び出されます。

        .alertX(isPresented: $viewModel.showAlert) {
            AlertX(logo: networkStore.currentNetwork.networkTheme.systemLogo ,
                   logoColor: networkStore.activeColors.lightTextColor ,
                   backgroundColor: networkStore.activeColors.primaryColor,
                   title: Text("AlertX Test"))
        }

B2Bアプリケーション$viewModel.showAlertに適合する独自のカスタマイズ@Published var showAlert: BoolAlertX含むカスタム ビューです。

私が抱えている問題は 、バインディングが変更さ.alertX(isPresented: れたかどうかに関係なく、ビューが読み込まれるか状態が変更されるたびに、クロージャー内の情報が呼び出されることです。同じことは、値が変更されたときにのみ呼び出される$viewModel.showAlert組み込みのビュー拡張には当てはまりません。.alert$viewModel.showAlert

public func alertX(isPresented: Binding<Bool>, content: () -> AlertX) -> some View {バインディング値が変更されたときにのみクロージャ内の情報が呼び出されるように、実装でどのような変更を加える必要がありますか?

4

1 に答える 1