Balbas Code

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で表示できるようになります。この方法を使えば、動的に生成されたデータや外部から取得したデータを簡単に反映することが可能です。


実行結果
swift_swiftUI2
ViewControllerで作成したデータをSwiftUIのViewを経由してSwiftで書かれたTableViewへ値を渡しています。