我想为View构建一个函数,它接受像onChange
或onPreferenceChange
这样的闭包。这是我的代码,使用此代码我可以读取value
或value
的更改,但我不能将其发送回我的ContentView,因为我想在ContentView中使用print(newValue)
。我该怎么做?谢谢你的帮助和时间。
import SwiftUI
struct ContentView: View {
@State private var stringOfText: String = "Hello, world!"
var body: some View {
Text(stringOfText)
.perform(value: stringOfText) // <<: Here: I want get back data as: { newValue in print(newValue) }
Button("update") { stringOfText += " updated!" }.padding()
}
}
extension View {
func perform(value: String) -> some View {
return self
.preference(key: CustomPreferenceKey.self, value: value)
.onPreferenceChange(CustomPreferenceKey.self) { newValue in
print(newValue)
// I want send back newValue to ContentView that perform used!
}
}
}
struct CustomPreferenceKey: PreferenceKey {
static var defaultValue: String { get { return String() } }
static func reduce(value: inout String, nextValue: () -> String) { value = nextValue() }
}
所以我们只需要在perform函数中添加回调闭包参数。像这个
func perform(value: String,callback : @escaping (_ value : String ) -> Void) -> some View
所以现在我们有了一个回调闭包,我们可以在其中发回值。
struct ContentView: View {
@State private var stringOfText: String = "Hello, world!"
var body: some View {
Text(stringOfText)
.perform(value: stringOfText) {
newValue in
print(newValue)
}
Button("update") { stringOfText += " updated!" }.padding()
}
}
extension View {
func perform(value: String,callback : @escaping (_ value : String ) -> Void) -> some View {
return self
.preference(key: CustomPreferenceKey.self, value: value)
.onPreferenceChange(CustomPreferenceKey.self) { newValue in
callback(newValue)
}
}
}
struct CustomPreferenceKey: PreferenceKey {
static var defaultValue: String { get { return String() } }
static func reduce(value: inout String, nextValue: () -> String) { value = nextValue() }
}