SwiftとSwiftUIを連動する2
公開日: 2024-10-13 11:53:43
前回書いた記事がCell内で作成するパターンでは実際のプロジェクト的には使えないことがわかったので、別の場所で作成したデータ(ViewController)を引数で渡してTableViewに反映させる方法を記載します。
ViewController.swift
import UIKit
import SwiftUI
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// ランダムなデータを生成
let randomData = generateRandomUserData()
// TestSwiftUI を生成し、ランダムデータを渡す
let swiftUIView = TestSwiftUI(userData: randomData)
// UIHostingController で SwiftUI を表示
let hostingController = UIHostingController(rootView: swiftUIView)
// HostingController を子ビューコントローラとして追加
addChild(hostingController)
hostingController.view.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(hostingController.view)
// HostingController のビューに制約を設定
NSLayoutConstraint.activate([
hostingController.view.topAnchor.constraint(equalTo: view.topAnchor),
hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
hostingController.didMove(toParent: self)
}
// ランダムな UserData を生成する関数
func generateRandomUserData() -> [UserData] {
let userNames = ["John", "Jane", "Tom", "Alice", "Bob"]
let subjects = ["Subject 1", "Subject 2", "Subject 3", "Subject 4", "Subject 5"]
let messages = [
"This is message 1.",
"This is message 2.",
"This is message 3.",
"This is message 4.",
"This is message 5."
]
var randomData = [UserData]()
for i in 0..<userNames.count {
let randomUser = UserData(
userID: String(i + 1),
userName: userNames[Int.random(in: 0..<userNames.count)],
subject: subjects[Int.random(in: 0..<subjects.count)],
message: messages[Int.random(in: 0..<messages.count)]
)
randomData.append(randomUser)
}
return randomData
}
}
TestSwiftUI.swift(表示用のView)
import SwiftUI
struct TestSwiftUI: View {
var userData: [UserData] // 動的データを受け取る
var body: some View {
VStack {
Text("Test SwiftUI with TableView")
.font(.largeTitle)
.padding()
TestSwiftTableViewRepresentable(userData: userData) // データを渡す
.edgesIgnoringSafeArea(.all)
}
}
}
TestSwiftTableViewRepresentable.swift(SwiftとSwiftUIの橋渡し)
import SwiftUI
struct TestSwiftTableViewRepresentable: UIViewControllerRepresentable {
var userData: [UserData] // データをプロパティとして保持
func makeUIViewController(context: Context) -> TestSwiftTableView {
let viewController = TestSwiftTableView()
viewController.userDataList = userData // データを設定
return viewController
}
func updateUIViewController(_ uiViewController: TestSwiftTableView, context: Context) {
// 必要に応じてデータを更新
}
}
TestSwiftTableView.swift(TableViewの内容)
import UIKit
class TestSwiftTableView: UIViewController, UITableViewDelegate, UITableViewDataSource {
var userDataList: [UserData] = [] // 外部から渡される動的データ
let tableView = UITableView()
override func viewDidLoad() {
super.viewDidLoad()
// テーブルビューの設定
tableView.delegate = self
tableView.dataSource = self
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UserCell")
tableView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(tableView)
// テーブルビューの制約
NSLayoutConstraint.activate([
tableView.topAnchor.constraint(equalTo: view.topAnchor),
tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
tableView.leadingAnchor.constraint(equalTo: view.leadingAnchor),
tableView.trailingAnchor.constraint(equalTo: view.trailingAnchor)
])
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return userDataList.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath)
let userData = userDataList[indexPath.row]
cell.textLabel?.text = "UserID: \(userData.userID)\nUserName: \(userData.userName)\nSubject: \(userData.subject)\nMessage: \(userData.message)"
cell.textLabel?.numberOfLines = 0
return cell
}
}
この流れにより、ViewControllerから動的に生成されたデータをSwiftUI経由でTestSwiftTableViewに渡し、ランダムな内容をUITableViewで表示できるようになります。この方法を使えば、動的に生成されたデータや外部から取得したデータを簡単に反映することが可能です。
実行結果
ViewControllerで作成したデータをSwiftUIのViewを経由してSwiftで書かれたTableViewへ値を渡しています。