Создайте оповещение с помощью всего одной кнопки действия
Я хочу 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
}))