Как представить оповещение с помощью SwiftUI

В 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>

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
22
0
30 578
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Вы можете использовать переменную @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"))
        })
    }
}

Или вы можете использовать PresentationButton, который делает то, что вы делаете, с меньшим количеством кода.

Fab1n 06.06.2019 18:25

К сожалению, этот ответ больше не является правильным, потому что .presentation устарел в SwiftUI.

funkenstrahlen 01.09.2019 00:05

Как это можно изменить для обработки предупреждений с помощью обработчиков!? У Swift была возможность иметь обработчики.

Learn2Code 21.06.2020 16:11
struct ContentView: View {

    @State var aAlert = false

    var body: some View {
        Text("Alert").tapAction {
            self.aAlert = true
        }.presentation($aAlert, alert:{ Alert(title: Text("Alert"))})
    }
}

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

Richard-Degenne 10.06.2019 18:01

В дополнение к ответу @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.

Rob 01.10.2019 08:34

Я тоже хотел бы знать. Я хотел бы иметь помощника: «showAlert», который ожидает заголовок и текст. И, например, показывает общее предупреждение, если параметры не указаны. Я пытался реализовать это как расширение для структуры представления, но не смог заставить его работать:/.

Schnodderbalken 12.11.2019 13:34

Вы можете сделать такое простое расширение @Schnodderbalken

Mojtaba Hosseini 26.10.2020 08:50

Полный код оповещения с действием «Отклонить» и «ОК»:

Код:

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()
    }
}

Выход:

Output

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()... это предупреждение не компилируется

Tim 05.06.2020 22:13

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"))
            }
        }
    }
}
  struct ContentView: View {
        @State private var showingAlert = false
    
        var body: some View {
            Button("Show Alert") {
                showingAlert = true
            }
            .alert("Important message", isPresented: $showingAlert) {
                Button("First") { }
                Button("Second") { }
                Button("Third") { }
            }
        }
    }

Другие вопросы по теме