Ios 如何在UIKit ViewController中使用EnvironmentObject

Ios 如何在UIKit ViewController中使用EnvironmentObject,ios,swiftui,uikit,uiviewcontrollerrepresentable,Ios,Swiftui,Uikit,Uiviewcontrollerrepresentable,我正在构建一个SwiftUI应用程序,它通过UIViewControllerRepresentable包装UIKitViewController。目标是在我的SwiftUI应用程序中显示UITextView。这一点的实现很简单,如下所示: // iOSTextView.swift import SwiftUI struct iOSTextView: UIViewControllerRepresentable { @Binding var document: Document @

我正在构建一个SwiftUI应用程序,它通过
UIViewControllerRepresentable
包装UIKit
ViewController
。目标是在我的SwiftUI应用程序中显示
UITextView
。这一点的实现很简单,如下所示:

// iOSTextView.swift
import SwiftUI

struct iOSTextView: UIViewControllerRepresentable {
    @Binding var document: Document
    @EnvironmentObject var userData: UserData
    
    func makeUIViewController(context: Context) -> some UIViewController {
        let view = iOSTextViewController()
        return view
    }
    
    func updateUIViewController(_ uiViewController: UIViewControllerType, context: Context) {

    }
}
注意名为
UserData
EnvironmentObject
。它是一个类,包含一些常规数据,应该与我的应用程序中的每个视图共享,包括UITextView ViewController

// UserData.swift
import Foundation

final class UserData: ObservableObject  {
    @Published var someValue = 1
}
下面是我的
iOSTextViewController
ViewController:

// iOSTextViewController.swift
import UIKit
import SwiftUI

class iOSTextViewController: UIViewController, UIGestureRecognizerDelegate {
    @EnvironmentObject var userData: UserData

    // Create a Text View
    let textView: UITextView = {
        let tv = UITextView()
        return tv
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Place the Text View on the view
        view.addSubview(textView)
        textView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        textView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true
        textView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true
        textView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
        
        // create attributed string
        let string = "This is a string."
        var attributes: [NSMutableAttributedString.Key: Any] = [
            .foregroundColor: UIColor.red,
            .font: UIFont(name: "Courier", size: 12)!
        ]
        let myAttrString = NSMutableAttributedString(string: string, attributes: attributes)
        textView.attributedText = myAttrString
    }    
}
我的问题:

  • 如何将
    UserData
    传递给名为
    iOSTextViewController
    的ViewController?我应该使用协调员吗?如何使用它在我的ViewController中使
    环境对象
    可用并同步

  • 同样,既然是基于文档的应用程序,我如何共享我的
    文档
    绑定


  • 这可以在SwiftUI中相对轻松地完成,将UserData变量传递给任何对象,您可以在单独的类中生成已发布的变量。这里有一个例子

    class UserDataManager: ObservableObject { 
    
         @Published var userData: UserData = UserData(variable1, variable2...)
    
    }
    
    
    然后在视图结构中,您可以简单地执行以下操作

    struct TextView: View { 
        
       @ObservedObject var userDataManager = UserDataManager()
    
       var body : some View {
         
          TextField("Enter your data", text: $userDataManager.userData.name)
    

    这可以在SwiftUI中相对轻松地完成,将UserData变量传递给任何对象,您可以在单独的类中生成已发布的变量。这里有一个例子

    class UserDataManager: ObservableObject { 
    
         @Published var userData: UserData = UserData(variable1, variable2...)
    
    }
    
    
    然后在视图结构中,您可以简单地执行以下操作

    struct TextView: View { 
        
       @ObservedObject var userDataManager = UserDataManager()
    
       var body : some View {
         
          TextField("Enter your data", text: $userDataManager.userData.name)
    

    对不起,这不是我要问的,我只是编辑了我的问题,让它更清楚。试着用@ObservedObject代替?这是一个很好的主意,但不可能用@EnvironmentObject吗?对不起,这不是我要问的,我只是编辑了我的问题,让它更清楚。试着用@ObservedObject代替?这是一个很好的主意,但是不可能使用@EnvironmentObject吗?