Расширение SwiftUI View вызывается при загрузке / обновлении просмотра

Мы создали настраиваемое расширение представления, чтобы расширить функциональность и добавить кучу настроек в соответствии с нашими потребностями;

      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"))
        }

Где @Published var showAlert: Bool а также AlertX - это настраиваемое представление, которое содержит наши собственные настройки, подходящие для нашего приложения B2B.

Проблема, с которой я столкнулся, заключается в том, что информация внутри закрытия для .alertX(isPresented: вызывается каждый раз, когда представление загружается или меняет состояние, независимо от того, изменяется ли привязка. То же самое НЕ относится к встроенным .alert расширение просмотра, которое вызывается ТОЛЬКО, когда $viewModel.showAlert изменение стоимости.

Какие изменения мне нужно внести в мою реализацию public func alertX(isPresented: Binding<Bool>, content: () -> AlertX) -> some View { чтобы информация внутри закрытия вызывалась только при изменении значения привязки?

1 ответ

Помните, что SwiftUI будет постоянно перезагружать все структуры и функции, а затем решает, основываясь на зависимостях данных, какую часть перерисовывать. Таким образом, любой код в ваших функциях просмотра будет работать. Много.

Попробуйте это: в верхней части этой функции поместите

      guard isPresented.wrappedValue == true else {
    return
}

Вместо того, чтобы проверять его позже в функции.

В связи с этим вы также можете захотеть превратить этот код в ViewModifier, а затем ваша функция alertX просто применяет viewModifier на основе привязки isPresent, в противном случае возвращает self.

Другие вопросы по тегам