【问题标题】:passing a value from swift viewcontroller to swiftui and then back again将值从 swift viewcontroller 传递给 swiftui,然后再返回
【发布时间】:2021-04-07 22:33:27
【问题描述】:

所以使用 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) 

【问题讨论】:

    标签: swift core-data swiftui


    【解决方案1】:

    有很多方法可以做到这一点,但我更喜欢闭包。您可以使用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)
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 2016-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多