【问题标题】:How to use EnvironmentObject in UIKit ViewController如何在 UIKit ViewController 中使用 EnvironmentObject
【发布时间】:2021-03-30 00:20:53
【问题描述】:

我正在构建一个将 UIKit ViewController 包装到 UIViewControllerRepresentable 的 SwiftUI 应用程序。目标是在我的 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) {

    }
}

注意名为UserDataEnvironmentObject。这是一个包含一些通用数据的类,这些数据应该与我的应用程序中的每个视图共享,包括 UITextView ViewController。

// UserData.swift
import Foundation

final class UserData: ObservableObject  {
    @Published var someValue = 1
}

下面是我的iOSTextViewControllerViewController:

// 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
    }    
}

我的问题:

  1. 如何将UserData 传递给名为iOSTextViewController 的ViewController?我应该使用协调员吗?如何使用它使 EnvironmentObject 在我的 ViewController 中可用和同步?

  2. 同样,我如何共享我的document 绑定,因为它是基于文档的应用程序?

【问题讨论】:

    标签: ios swiftui uikit uiviewcontrollerrepresentable


    【解决方案1】:

    这可以在 SwiftUI 中相对轻松地完成,将 UserData 变量传递给任何可以在单独的类中创建 Published 变量的对象。这是一个例子

    class UserDataManager: ObservableObject { 
    
         @Published var userData: UserData = UserData(variable1, variable2...)
    
    }
    
    

    然后在你的 View 结构中你可以简单地做

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

    【讨论】:

    • 抱歉,这不是我要问的问题,我只是编辑了我的问题以使其更清楚。
    • 尝试改用@ObservedObject?
    • 这是一个非常好的主意,但不能使用@EnvironmentObject 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 2021-05-11
    相关资源
    最近更新 更多