如何在SwiftUI中创建一个返回一些View并接受闭包的函数



我想为View构建一个函数,它接受像onChangeonPreferenceChange这样的闭包。这是我的代码,使用此代码我可以读取valuevalue的更改,但我不能将其发送回我的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() }

}

相关内容

最新更新