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
相关产品推荐
相关产品推荐

