3

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
}

以下は私の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という名前の ViewControllerに渡すにはどうすればよいiOSTextViewControllerですか? コーディネーターを使用する必要がありますか? EnvironmentObjectViewController 内で使用可能にして同期するにはどうすればよいですか?

  2. document同様に、バインディングはドキュメント ベースのアプリなので、どうすれば共有できますか?

4

1 に答える 1