如何解决如何在 UIKit ViewController 中使用 EnvironmentObject
我正在构建一个包含 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) {
}
}
注意名为 EnvironmentObject
的 UserData
。这是一个类,其中包含一些应该与我的应用程序中的每个视图共享的一般数据,包括 UITextView ViewController。
// UserData.swift
import Foundation
final class UserData: ObservableObject {
@Published var someValue = 1
}
下面是我的 iOSTextViewController
视图控制器:
// 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?我应该使用协调器吗?如何使用它使EnvironmentObject
在我的 ViewController 中可用并同步? -
同样,我如何共享我的
document
绑定,因为它是一个基于文档的应用程序?
解决方法
这可以在 SwiftUI 中相对轻松地完成,将您的 UserData 变量传递给任何对象,您可以在单独的类中创建 Published 变量。这是一个例子
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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。