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

Swift iOS:如何从Collection View向prepare方法传递数据

解决Collection View数据传递到prepare方法的问题

首先,你现在访问不到getTempDetails["name"]的核心原因是:prepare(for:sender:)方法里默认的sender并不是你Collection View里的数据源对象,得先在Collection View的选中逻辑里,主动把对应的数据或者索引传递给segue的sender,这样在prepare里才能拿到它。

下面是具体的步骤和代码示例:

1. 在Collection View的选中方法里触发segue并传递正确的sender

找到你的Collection View的didSelectItemAt方法,在这里触发segue,并且把选中的数据源字典或者索引路径作为sender传过去:

override func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
    // 假设你的数据源数组是tempDetailsArray,里面存的是类似getTempDetails的字典
    let selectedDetails = tempDetailsArray[indexPath.item]
    // 触发segue,把选中的字典作为sender传递
    performSegue(withIdentifier: "你的Segue标识符", sender: selectedDetails)
    
    // 或者你也可以传indexPath,后面在prepare里再取数据:
    // performSegue(withIdentifier: "你的Segue标识符", sender: indexPath)
}

2. 修改prepare方法,从sender里获取数据并赋值

接下来修改你的prepare(for:sender:)方法,从sender里拿到传递过来的数据,然后赋值给目标控制器的chore_name:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // 先判断目标控制器是不是ChoreDetailsViewController
    guard let destination = segue.destination as? ChoreDetailsViewController else {
        return
    }
    
    // 情况1:如果sender传的是选中的字典
    if let selectedDetails = sender as? [String: Any] {
        // 建议用可选绑定避免强制解包崩溃
        if let name = selectedDetails["name"] as? String {
            destination.chore_name = name
        }
    }
    
    // 情况2:如果sender传的是indexPath,就从数据源数组里取数据
    // if let indexPath = sender as? IndexPath {
    //     let selectedDetails = tempDetailsArray[indexPath.item]
    //     if let name = selectedDetails["name"] as? String {
    //         destination.chore_name = name
    //     }
    // }
}

额外注意点

  • 一定要确保代码里的Segue标识符和Storyboard里设置的完全一致,不然segue会触发失败
  • 尽量避免用!强制解包,用if let或者guard let做可选绑定,能有效避免因数据为空导致的崩溃

内容的提问来源于stack exchange,提问作者user9606220

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:22:51