Как представить оповещение в SwiftUI без кнопок
У меня есть ситуация, когда я хотел бы воссоздать предыдущие UIKit
логики путем отображения Alert
во время длительной операции, с которой пользователь не может взаимодействовать.
Раньше в UIKit это было бы так просто:
import UIKit
class ViewController: UIViewController {
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
let alertController = UIAlertController(title: "Loading",
message: nil,
preferredStyle: .alert)
present(alertController, animated: true, completion: nil)
}
}
А это выглядит так:
Простой SwiftUI
версия на основе может быть создана как таковая:
import SwiftUI
struct ContentView: View {
@State private var isLoading = true
var body: some View {
Text("Hello")
.modifier(LoadingAlert(isPresented: $isLoading))
}
}
struct LoadingAlert: ViewModifier {
@Binding var isPresented: Bool
func body(content: Content) -> some View {
content
.alert(isPresented: $isPresented) {
Alert(title: Text(NSLocalizedString("Loading", comment: "")),
dismissButton: .none)
}
}
}
Использую ли я nil
или .none
как dismissButton
аргумент или полностью опустить строку, будет использоваться значение по умолчанию OK
кнопку, и произведите это:
Я изменил Alert
аргументы, отправив кнопку с пустым title
, но это не такой чистый результат, как хотелось бы:
dismissButton: .default(Text("")))
Исходя из того, что я видел, не похоже, что Alert в SwiftUI поддерживает то, что я хочу, на основе проверки его инициализаторов.
/// Creates an alert with one button.
public init(title: Text, message: Text? = nil, dismissButton: Alert.Button? = nil)
/// Creates an alert with two buttons.
///
/// - Note: the system determines the visual ordering of the buttons.
public init(title: Text, message: Text? = nil, primaryButton: Alert.Button, secondaryButton: Alert.Button)
Для этого проекта цель состоит в том, чтобы полностью использовать SwiftUI, но, похоже, это сценарий, при котором мы не можем получить желаемый результат.
Я считаю, что либо нам придется использовать UIKit на основе AlertController
, или используйте другой эффект для обозначения статуса. Однако я бы хотел ошибиться здесь.
2 ответа
Я не думаю, что в SwiftUI в настоящее время поддерживается предупреждение без кнопки закрытия, но вы можете создать собственное представление и представить его с тем же эффектом.
Эта библиотека может вам помочь: https://github.com/exyte/PopupView
Вы можете попробовать это:
var dialogMessage = UIAlertController(title: "Erro", message: "error description", preferredStyle: .alert)
let window = UIApplication.shared.keyWindow
window?.rootViewController?.present(dialogMessage, animated: true)
}