Кнопка модификатора Swiftui .alert не установит @State презентацию var обратно в false - PullRequest
0 голосов
/ 13 апреля 2020

Что не так в приведенном ниже коде, который мешает Отображение оповещения Переустановить переменную обратно в ложь при отклонении оповещения?

Возможно, мне не хватает некоторой точки, которая имеет что-то иметь дело с onreceive модификатором ...

Вот пример кода.

import SwiftUI
import Combine

struct ContentView: View {
    @State private var showingAlert = false

    @State private var myValue: String = ""

    var body: some View {
        VStack {
            Text(showingAlert ? "T" : "F")
            TextField("placeholder",  text: $myValue)
            .onReceive(Just(myValue)) { newValue in
                self.showingAlert = true
            }
        }

        .alert(isPresented: $showingAlert) {
            Alert(title: Text("Important message"), message: Text("SOME VALUE..."), dismissButton: .default(Text("Got it!")))
        }
    }
}

Кстати, он не будет работать, если вы попытаться заставить так:

...

 .alert(isPresented: $showingAlert) {
            Alert(title: Text("Important message"), message: Text("SOME VALUE..."), dismissButton: .default(Text("Got it!")) {
                    self.showingAlert = false
                })
        }

...

Заранее спасибо и благословил всех на Пасху ...

GpE

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Ваш alert работает должным образом и сбрасывает значение showingAlert

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

TextField("placeholder",  text: $myValue, onEditingChanged: {
        if !$0 {
            print($0)
            self.showingAlert = true
        }
    })

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

0 голосов
/ 14 апреля 2020

Найден обходной путь (думаю, что что-то более чистое, безусловно, возможно ... но на данный момент это работает!)

Также немного изменил код для более ясного представления о том, почему я использую onreceive .

В примере я хочу, чтобы предупреждение показывалось, если третья введенная буква - «Z» (в верхнем регистре ...). iAlertCheck var делает трюк: ему присваивается постоянное значение непосредственно перед прекращением оповещения. Чем он проверен внутри onreceive , и если == константа, то обе переменные ( iAlertCheck и withAlert ) сброс.

import SwiftUI
import Combine

extension String {
    subscript(i: Int) -> String {
        return String(self[index(startIndex, offsetBy: i)])
    }
}

struct ContentView: View {
    @State private var showingAlert = false

    @State private var myValue: String = ""

    static var iCount: Int = 0
    static var iAlertCheck = 0

    var body: some View {
        VStack {
            Text(showingAlert ? "T" : "F")
            TextField("placeholder",  text: $myValue)
            .onReceive(Just(myValue)) { newValue in


                ContentView.iCount += 1
                print("\(ContentView.iCount): iAlertCheck: \(ContentView.iAlertCheck)")

                if newValue.count == 3 && newValue[2] == "Z" {
                    if ContentView.iAlertCheck == 0 {
                        self.showingAlert = true
                    }
                    else if ContentView.iAlertCheck == -10 {
                        ContentView.iAlertCheck = 0
                        self.showingAlert = false
                    }
                }
            }
        }

        .alert(isPresented: $showingAlert) {
            Alert(title: Text("Important message"), message: Text("SOME VALUE..."), dismissButton: .default(Text("Got it!")) {
                ContentView.iAlertCheck = -10
            })
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...