纯代码实现UITableView点击时在视图控制器间传递索引与数据
解决方案:纯代码实现UITableView单元格跳转并传递索引与数据
步骤1:给SecondViewController添加数据接收能力
修改SecondViewController,新增用于接收选中行索引和对应文本的属性,并通过自定义初始化方法传入数据,最后在页面加载时用这些数据更新UI。
步骤2:在单元格选中事件中传递数据
在ItemsViewController的didSelectRowAt方法里,获取当前选中行的索引和对应内容,初始化SecondViewController时传入这些数据,再执行跳转操作。
修改后的完整代码
import UIKit class ItemsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, ItemsBaseCoordinated { var coordinator: ItemsBaseCoordinator? private let myArray: [String] = ["India","Canada","Australia"] // 替换NSArray为Swift原生数组,更符合编码规范 private var myTableView: UITableView! init(coordinator: ItemsBaseCoordinator) { super.init(nibName: nil, bundle: nil) self.coordinator = coordinator title = "Items" } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() let barHeight = UIApplication.shared.connectedScenes .filter {$0.activationState == .foregroundActive } .map {$0 as? UIWindowScene } .compactMap { $0 } .first?.windows .filter({ $0.isKeyWindow }).first? .windowScene?.statusBarManager?.statusBarFrame.height ?? 0 let displayWidth: CGFloat = self.view.frame.width let displayHeight: CGFloat = self.view.frame.height myTableView = UITableView(frame: CGRect(x: 0, y: barHeight, width: displayWidth, height: displayHeight - barHeight)) myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell") myTableView.dataSource = self myTableView.delegate = self self.view.addSubview(myTableView) } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return myArray.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "MyCell", for: indexPath) cell.textLabel!.text = myArray[indexPath.row] return cell } func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { print("Selected Row \(indexPath.row)") // 获取选中行的索引和对应文本 let selectedIndex = indexPath.row let selectedText = myArray[selectedIndex] // 初始化SecondViewController并传入数据 let nextVC = SecondViewController(selectedIndex: selectedIndex, selectedText: selectedText) navigationController?.pushViewController(nextVC, animated: true) } } class SecondViewController: UIViewController { // 定义接收数据的属性 private let selectedIndex: Int private let selectedText: String // 自定义初始化方法,接收外部传入的数据 init(selectedIndex: Int, selectedText: String) { self.selectedIndex = selectedIndex self.selectedText = selectedText super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } override func viewDidLoad() { super.viewDidLoad() view.backgroundColor = .systemRed // 使用传递的数据更新页面内容 title = "Row \(selectedIndex)" // 添加标签展示选中的文本内容 let displayLabel = UILabel(frame: CGRect(x: 20, y: 100, width: view.frame.width - 40, height: 40)) displayLabel.text = "选中内容: \(selectedText)" displayLabel.textAlignment = .center displayLabel.textColor = .white view.addSubview(displayLabel) } }
额外优化提示
- 若后续数据结构更复杂,建议封装成独立的数据模型类(比如
Country),直接传递模型对象,提升代码扩展性和可读性。 - 保持Swift原生类型的使用,避免不必要的
NSArray等OC类型依赖。
内容的提问来源于stack exchange,提问作者Tom Brooke
相关产品推荐
相关产品推荐

