UIKit をラップする SwiftUI アプリを構築ViewController
していUIViewControllerRepresentable
ます。目標はUITextView
、SwiftUI アプリに を表示することです。これの実装は次のように簡単です。
// 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
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
という名前の ViewControllerに渡すにはどうすればよいiOSTextViewController
ですか? コーディネーターを使用する必要がありますか?EnvironmentObject
ViewController 内で使用可能にして同期するにはどうすればよいですか?document
同様に、バインディングはドキュメント ベースのアプリなので、どうすれば共有できますか?