Расширение 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.