Как вызвать функцию просмотра содержимого из экземпляра класса в Swift? - PullRequest
0 голосов
/ 17 февраля 2020

Внутри моего ContentView я создаю экземпляр класса, который я назвал timer. Когда таймер timerText достигает значения «0:00», я хочу, чтобы таймер вызвал функцию в ContentView, чтобы отредактировать представление с информацией, которая недоступна из таймера. Однако я не знаю, как вызвать функцию из ContentView из этого класса таймера. Это вообще возможно?

Если это невозможно, я мог бы достичь той же цели, создав переменную timerText в ContentView, которая всегда синхронизируется с переменной timerText объекта таймера. Таким образом, когда в «ContentText» ContentView установлено «0:00», я могу просто вызвать функцию как обычно, потому что я уже «внутри» ContentView. Однако я не знаю, как синхронизировать переменную между двумя разными классами. Есть ли способ сделать это?

1 Ответ

0 голосов
/ 17 февраля 2020

Если я правильно понял, чего вы хотите достичь, это решение поможет вам:

  1. Используйте Combine и введите timerText @Published;
  2. In ContentView используйте .onReceive fun c в любом View и при необходимости вызывайте свою функцию.

Вот простой пример кода:

import SwiftUI
import Combine

final class SpecialTimer: ObservableObject {

    @Published var timerText = "0:01"

    func resetTimer() {
        timerText = "0:00"
    }

}

struct SpecialTimerView: View {

    @EnvironmentObject var timer: SpecialTimer
    @State private var didEditedSpecialInfo = false

    var body: some View {

        VStack {

            Text(timer.timerText)
                .onReceive(timer.$timerText) { timerText in
                    guard timerText == "0:00" else { return }
                    self.whenTimerResets()
            }

            Button(action: {self.timer.resetTimer()} ) {
                Text("reset timer!")
            }

            Text("timer did reset")
                .opacity(didEditedSpecialInfo ? 1 : 0)

        }

    }

    private func whenTimerResets() {
        print("edit the view with information that is not accessible from the timer")
        didEditedSpecialInfo = true

    }

}

struct SpecialTimerView_Previews: PreviewProvider {
    static var previews: some View {
        SpecialTimerView()
            .environmentObject(SpecialTimer())
    }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...