カスタム ビュー拡張機能を作成して、機能を拡張.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: Bool
をAlertX
含むカスタム ビューです。
私が抱えている問題は 、バインディングが変更さ.alertX(isPresented:
れたかどうかに関係なく、ビューが読み込まれるか状態が変更されるたびに、クロージャー内の情報が呼び出されることです。同じことは、値が変更されたときにのみ呼び出される$viewModel.showAlert
組み込みのビュー拡張には当てはまりません。.alert
$viewModel.showAlert
public func alertX(isPresented: Binding<Bool>, content: () -> AlertX) -> some View {
バインディング値が変更されたときにのみクロージャ内の情報が呼び出されるように、実装でどのような変更を加える必要がありますか?