Как представить оповещение в 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)
    }
Другие вопросы по тегам