В SwiftUI я обнаружил тип Alert. Но мне интересно, как это показать методом presentation.
Инициализировать Alert довольно просто. Но как использовать привязку?
struct ContentView : View {
var body: some View {
Button(action: {
// Don't know how to use the `binding` below
presentation(binding, alert: {
Alert(title: Text("Hello"))
})
}, label: {
Text("asdf")
})
}
}
Переплет типа Binding<Bool>





Вы можете использовать переменную @State в качестве привязки. В качестве альтернативы вы можете использовать переменную @EnvironmentObject, которая использует BindableObject.
Я думаю, вам нужно вызвать presentation в корневом представлении, чтобы заставить его работать, добавление его в Stack, Group и т. д., похоже, не работает.
Этот фрагмент, кажется, делает свое дело. Обратите внимание, что переменная @State устанавливается в значение false после закрытия предупреждения.
struct ContentView: View {
@State var showsAlert = false
var body: some View {
Button(action: {
self.showsAlert = true
}, label: {
Text("asdf")
}).presentation($showsAlert, alert: {
Alert(title: Text("Hello"))
})
}
}
К сожалению, этот ответ больше не является правильным, потому что .presentation устарел в SwiftUI.
Как это можно изменить для обработки предупреждений с помощью обработчиков!? У Swift была возможность иметь обработчики.
struct ContentView: View {
@State var aAlert = false
var body: some View {
Text("Alert").tapAction {
self.aAlert = true
}.presentation($aAlert, alert:{ Alert(title: Text("Alert"))})
}
}
Можете ли вы немного уточнить свой ответ? Например, объяснения интересных частей вашего фрагмента кода или ссылки на документацию?
В дополнение к ответу @tsp, чтобы отобразить предупреждение с двумя кнопками и обработать нажатие кнопки, вы можете сделать следующее:
@State var showAlert = false
var body: some View {
Button(action: {
self.showAlert = true
}) {
Text("Show Alert")
}
.presentation($showAlert) {
Alert(title: Text("Title"), message: Text("Message..."),
primaryButton: .default (Text("OK")) {
print("OK button tapped")
},
secondaryButton: .cancel()
)
}
}
Результат:
.presentation() фактически устарел в бета-версии 4. Вот версия, которая в настоящее время работает с модификатором .alert().
struct ContentView: View {
@State var showsAlert = false
var body: some View {
Button(action: {
self.showsAlert.toggle()
}) {
Text("Show Alert")
}
.alert(isPresented: self.$showsAlert) {
Alert(title: Text("Hello"))
}
}
}
Как мы можем использовать его в помощнике? Так как нам приходится много раз вызывать Alert.
Я тоже хотел бы знать. Я хотел бы иметь помощника: «showAlert», который ожидает заголовок и текст. И, например, показывает общее предупреждение, если параметры не указаны. Я пытался реализовать это как расширение для структуры представления, но не смог заставить его работать:/.
Вы можете сделать такое простое расширение @Schnodderbalken
Полный код оповещения с действием «Отклонить» и «ОК»:
Код:
import SwiftUI
struct ContentView: View {
@State private var isAlert = false
var body: some View {
Button(action: {
self.isAlert = true
}) {
Text("Click Alert")
.foregroundColor(Color.white)
}
.padding()
.background(Color.blue)
.alert(isPresented: $isAlert) { () -> Alert in
Alert(title: Text("iOSDevCenters"), message: Text("This Tutorial for SwiftUI Alert."), primaryButton: .default(Text("Okay"), action: {
print("Okay Click")
}), secondaryButton: .default(Text("Dismiss")))
}
}
}
struct ContentView_Previews: PreviewProvider {
static var previews: some View {
ContentView()
}
}
Выход:
SwiftUI
Сначала создайте базовое оповещение:
Alert(title: Text("Alert title"), message: Text("Alert message"), dismissButton: .default(Text("Got it!")))
Затем определите привязываемое условие, которое сообщает, будет ли оповещение видимым или нет. Переключите это условие, чтобы показать/скрыть предупреждение.
struct ContentView: View {
@State private var showingAlert = false
var body: some View {
Button(action: {
self.showingAlert = true
}) {
Text("Show Alert")
}
.alert(isPresented: $showingAlert) {
Alert(title: Text("Important message"), message: Text("Wear sunscreen"), dismissButton: .default(Text("Got it!")))
}
}
}
Пример с onTapGesture
struct MyRow: View {
@State private var showingAlert = false
var body: some View {
HStack {
Text("Hello")
Text("World")
}
.onTapGesture {
self.showingAlert = true
}
.alert(isPresented: $showingAlert, content: {
Alert(title: Text("Title"), message: Text("Message"), dismissButton: .default(Text("OK")))
})
}
}
Мне не удалось заставить работать оповещения от перетаскивания в swiftui. Ану идея как это сделать в этом случае? Спасибо! .overlay(Rectangle() .gesture( DragGesture(minimumDistance: 50) .onEnded { жест, если жест правильный... { .alert(isPresented: $showAlert, content: { Alert()... это предупреждение не компилируется
In addition to @thisIsTheFoxe 's answer, you can implement a simple extension:
public extension View {
func alert(isPresented: Binding<Bool>,
title: String,
message: String? = nil,
dismissButton: Alert.Button? = nil) -> some View {
alert(isPresented: isPresented) {
Alert(title: Text(title),
message: {
if let message = message { return Text(message) }
else { return nil } }(),
dismissButton: dismissButton)
}
}
}
Теперь вы можете легко использовать его, например:
struct ContentView: View {
@State var showsAlert = false
var body: some View {
Button("Show Alert") {
self.showsAlert.toggle()
}
.alert(isPresented: $showsAlert, title: "title", message: "Message") // <- Here
}
}
Вот решение для представления предупреждений несколько. Работает на iOS13-iOS15:
struct YourView: View {
enum AlertType: Identifiable {
case first, second
var id: Int {
hashValue
}
}
@State var alertType: AlertType?
var body: some View {
VStack {
Button("Show alert #1") {
alertType = .first
}
Button("Show alert #2") {
alertType = .second
}
}
.alert(item: $alertType) { type in
switch type {
case .first:
return Alert(title: Text("First alert"))
case .second:
return Alert(title: Text("Second alert"))
}
}
}
}
Или вы можете использовать
PresentationButton, который делает то, что вы делаете, с меньшим количеством кода.