You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

纯代码实现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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:01:18