SwiftUI: получать уведомления при изменении значения @Binding - PullRequest
0 голосов
/ 13 октября 2019

Я написал представление для создания эффекта пишущей машинки в SwiftUI - когда я передаю переменную привязки, она отлично работает в первый раз, например: TypewriterTextView ($ textString)

Однако в любой последующий момент значение textStringизменения не будут работать (так как значение привязки не помещается непосредственно в тело). Интересуют любые идеи о том, как вручную получать уведомления при изменении переменной @Binding в представлении.

struct TypewriterTextView: View {

    @Binding var textString:String
    @State private var typingInterval = 0.3
    @State private var typedString = ""

    var body: some View {
        Text(typedString).onAppear() {
            Timer.scheduledTimer(withTimeInterval: self.typingInterval, repeats: true, block: { timer in

                if self.typedString.length < self.textString.length {
                    self.typedString = self.typedString + self.textString[self.typedString.length]
                }
                else { timer.invalidate() }
            })
        }
    }
}

1 Ответ

0 голосов
/ 13 октября 2019

Для этого вы можете использовать так называемого издателя:

public let subject = PassthroughSubject<String, Never>()

Затем, внутри вашего блока таймера, вы звоните:

self.subject.send()

Как правило, вы хотите, чтобы вышеуказанный код был за пределами вашегоОбъявление SwiftUI UI.

Теперь в вашем коде SwiftUI вам необходимо получить следующее:

Text(typedString)
    .onReceive(<...>.subject)
    { (string) in
        self.typedString = string
    }

<...> необходимо заменить тем, где находится ваш объект subject. Например (как взлом на AppDelegate):

 .onReceive((UIApplication.shared.delegate as! AppDelegate).subject)

Я знаю, что выше должно работать, когда typedString это @State:

@State private var typedString = ""

, но я думаю, этотакже должен работать с @Binding;просто еще не пробовал.

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