Как отключить / изменить кнопку с помощью SwiftUI? - PullRequest
0 голосов
/ 10 февраля 2020

Я хочу создать PO C, используя SwiftUI и CoreML. Я использую простую кнопку для вызова некоторой функции (здесь она называется test). Эта функция довольно тяжелая, поскольку она выполняет вывод CoreML, и ее вычисление может занять до минуты.

У меня есть несколько проблем:

  • Кнопка все еще остается активен, даже когда вычисления продолжаются. Другими словами, если я нажму кнопку несколько раз, прежде чем обработка первого щелчка будет завершена, обработка будет выполнена несколько раз. Я хочу отключить кнопку, пока обработка продолжается.

  • Я попытался изменить внешний вид кнопки, чтобы указать пользователю, что обработка продолжается. В приведенном ниже примере я меняю цвет кнопки на красный перед вызовом функции test и снова меняю ее на синий после завершения обработки. Но это не работает.

В приведенном ниже коде функция test просто спит в течение 5 секунд для имитации вывода CoreML.

func test() -> Void {
    print("Start processing")
    sleep(5)
    print("End processing")
}

struct ContentView: View {

    @State private var buttonColor : Color = .blue

    var body: some View {
        VStack {

            Button(action: {
                self.buttonColor = .red
                test()
                self.buttonColor = .blue
            }) {
                Text("Start")
                    .font(.title)
                    .padding(.horizontal, 40)
                    .padding(.vertical, 5)
                    .background(self.buttonColor)
                    .foregroundColor(.white)
            }
        }
    }
}

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

1 Ответ

2 голосов
/ 10 февраля 2020

Здесь возможен подход (см. Также комментарии в коде). Протестировано и работает с Xcode 11.2 / iOS 13.2.

struct ContentView: View {

    @State private var buttonColor : Color = .blue

    var body: some View {
        VStack {

            Button(action: {
                self.buttonColor = .red

                DispatchQueue.global(qos: .background).async { // do in background
                    test()
                    DispatchQueue.main.async {
                        self.buttonColor = .blue // work with UI only in main
                    }
                }

            }) {
                Text("Start")
                    .font(.title)
                    .padding(.horizontal, 40)
                    .padding(.vertical, 5)
                    .background(self.buttonColor)
                    .foregroundColor(.white)
            }
            .disabled(self.buttonColor == .red) // disabled while calculating
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...