所以使用 UIHostingController 从旧的视图控制器打开一个 swiftUI 视图。打算在花哨的 swiftui 界面中进行一些编辑,然后当我关闭 swiftui 视图时想要将编辑后的值传递回原始视图控制器。
我可以将价值转移到 swiftui 视图,但想知道如何取回它?寻找快速的方向。是协议,可观察的。什么是正确的方法
将价值从 VC 传递给 SwiftUI 并说:但要取回价值??
var selectedValue:String = "this is the selected text to edit"
let swiftUIView = swiftUIEditView(valueSelected: selectedValue)
let hostingController = UIHostingController(rootView: swiftUIView)
present(hostingController, animated: true, completion: nil)
有很多方法可以做到这一点,但我更喜欢闭包。您可以使用dismissedWithString
闭包传回值,如下所示:
struct SwiftUIEditView: View {
@State var valueSelected: String
var dismissedWithString: ((String) -> Void)? /// closure here!
var body: some View {
VStack {
TextField("Text field", text: $valueSelected)
.multilineTextAlignment(.center)
Button(action: {
dismissedWithString?(valueSelected) /// call the closure and pass in the text
}) {
Text("Return string and dismiss")
}
}
}
}
然后你的视图控制器将是这样的:
class ViewController: UIViewController {
var selectedValue: String = "this is the selected text to edit"
func presentEditView() {
var viewController: UIViewController?
let contentView = SwiftUIEditView(valueSelected: selectedValue) { [weak self] returnedString in
/// dismiss UIHostingController - it's a trailing closure, so you don't need to put the `dismissSelf`
viewController?.dismiss(animated: true, completion: nil)
self?.selectedValue = returnedString /// assign
print(returnedString) /// will be the value
}
viewController = UIHostingController(rootView: contentView)
if let vc = viewController { /// viewController will never be nil, but I don't like to force-unwrap
self.present(vc, animated: true, completion: nil)
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句