Создайте оповещение с помощью всего одной кнопки действия

Я хочу Alertс помощью одной кнопки, запускающей какой-то код. Я не хочу, чтобы была кнопка отмены. Я видел только способ иметь две кнопки сprimaryButton а также secondaryButton. Есть ли способ сделать что-то подобное?

2 ответа

Решение

При создании оповещения в SwiftUI документация - отличное место, где можно посмотреть, что вам доступно.

В разделе " Создание оповещения " мы видим следующее:

init(title: Text, message: Text?, primaryButton: Alert.Button, secondaryButton: Alert.Button)

Создает оповещение с двумя кнопками.

init(title: Text, message: Text?, dismissButton: Alert.Button?)

Создает оповещение с помощью одной кнопки.

Как указано в документации, чтобы создать оповещение с помощью одной кнопки, вы выбираете второй вариант.

Есть четыре различных типа кнопок, которые вы можете использовать в предупреждении, см. Здесь.

static func cancel((() -> Void)?) -> Alert.Button

Кнопка предупреждения, указывающая на отмену.

static func cancel(Text, action: (() -> Void)?) -> Alert.Button

Создает Alert.Button, указывающий на отмену некоторой операции.

static func default(Text, action: (() -> Void)?) -> Alert.Button

Создает Alert.Button со стилем по умолчанию.

static func destructive(Text, action: (() -> Void)?) -> Alert.Button

Создает Alert.Button со стилем, указывающим на уничтожение некоторых данных.

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


Оповещения без каких-либо действий

Эти три предупреждения идентичны по тому, что они создают.

Alert(title: Text("Alert Title"), message: Text("Alert message"), dismissButton: .default(Text("OK")))

Alert(title: Text("Alert Title"), message: Text("Alert message"), dismissButton: .default(Text("OK"), action: nil))

Alert(title: Text("Alert Title"), message: Text("Alert message"), dismissButton: .default(Text("OK"), action: {}))

Поскольку действие является необязательным и его значение по умолчанию равно nil, мы можем либо пропустить, передать nil, либо передать пустое закрытие. Первый вариант - это то, что я бы выбрал, если бы не выполнял действие.


Оповещения с действием

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

Это предупреждение содержит код, который должен запускаться при нажатии на действие, содержащееся в закрытии. Это нормально, если у вас есть одна строка кода для запуска, но это может начать загромождать ваше представление, если у вас есть несколько строк кода.

Alert(title: Text("Alert Title"),
      message: Text("Alert message"),
      dismissButton: .default(Text("OK"), action: { print("Hello")}))

Действие этого предупреждения зависит от функции, объявленной в ContentView. Это означает, что довольно сложная функция не будет загромождать код вашего представления.

struct ContentView: View {

    @State private var showAlert: Bool = false

    var body: some View {
        Button(action: { self.showAlert.toggle() },
               label: { Text("Show Alert") })
        .alert(isPresented: $showAlert, content: {
            Alert(title: Text("Alert Title"),
                  message: Text("Alert message"),
                  dismissButton: .default(Text("OK"), action: self.hello))
        })
    }

    func hello() {
        print("Hello")
    }
}

Хотя это немного противоречит интуиции, вы можете использовать dismissButton параметр для любого стиля кнопки, а не только .cancel().

Alert(title: Text("Title"), message: Text("Message"), dismissButton: .default(Text("Run Code"), action: { 
    // code
}))
Другие вопросы по тегам