iOS Swift使用Segue跳转时TableView之间传值为空是什么原因?
问题原因
你当前代码的逻辑存在实例不匹配的问题:手动初始化了一个MealsByCategoryVC实例并为它的mealCategory赋值,但调用performSegue(withIdentifier:sender:)方法时,系统会自动生成一个全新的MealsByCategoryVC实例完成跳转,你之前赋值的实例根本没有被加载到页面栈中,所以跳转后打印的变量自然为空。
解决方案
方案1:使用Segue自带的传值方法(推荐,适配你当前的Segue跳转逻辑)
- 调整
didSelectRowAt方法,把选中的分类作为sender参数传递,不需要手动创建目标控制器实例:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let category = listOfCategories[indexPath.row].strCategory print(category) // Properly returns the category performSegue(withIdentifier: "searchMeals", sender: category) }
- 在当前控制器中实现
prepare(for:sender:)方法,获取Segue对应的目标控制器完成赋值:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "searchMeals", let targetVC = segue.destination as? MealsByCategoryVC, let sendCategory = sender as? String else { return } targetVC.mealCategory = sendCategory }
方案2:放弃Segue,直接跳转手动创建的控制器实例
如果不需要依赖Storyboard的Segue,可以直接删除Storyboard中对应的Segue,用代码完成跳转,此时你手动创建的实例会被直接使用:
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let category = listOfCategories[indexPath.row].strCategory let vc = MealsByCategoryVC() vc.mealCategory = category print(category) // Properly returns the category // 导航栈push跳转用下面这行 navigationController?.pushViewController(vc, animated: true) // 模态跳转用下面这行 // present(vc, animated: true) }
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

