如何在视图控制器间传数据?TableView跳转选Push还是Present?
嘿,针对你的问题我来详细拆解下~
先回答:选 Push 还是 Present?
肯定优先选 Push 呀!原因很简单:
- Push 是基于导航栈的跳转方式,完美适配「列表页→详情页」这种层级递进的场景,用户能通过导航栏的返回按钮轻松回到上一页,完全符合iOS用户的使用习惯。
- Present 更适合模态弹窗、设置页这类需要用户完成操作才能返回的场景,它会直接覆盖当前页面,默认返回逻辑(比如下拉返回)和你的列表跳转需求不匹配,用起来会很违和。
代码实现步骤
首先得确保你的 NearbyViewController 已经嵌入到 UINavigationController 里了,不然没法用 Push 跳转。接下来修改你的 didSelectRowAt 方法:
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { // 获取选中的cell名称 let selectedCellName = myList[indexPath.row] // 实例化第二个视图控制器(记得把"DetailViewController"换成你实际的VC类名和Storyboard ID) guard let detailVC = storyboard?.instantiateViewController(withIdentifier: "DetailViewController") as? DetailViewController else { print("无法实例化详情页VC") return } // 给详情页传递数据——建议在详情VC里先定义一个接收属性 detailVC.selectedCellName = selectedCellName // 用Push方式跳转 navigationController?.pushViewController(detailVC, animated: true) }
然后在你的第二个视图控制器(比如叫 DetailViewController)里,接收数据并赋值给textField:
class DetailViewController: UIViewController { // 定义属性接收传递过来的cell名称 var selectedCellName: String? // 假设你已经通过Storyboard关联了textField的IBOutlet @IBOutlet weak var targetTextField: UITextField! override func viewDidLoad() { super.viewDidLoad() // 给textField设置显示内容 targetTextField.text = selectedCellName } }
额外注意点
- 要在Storyboard里给第二个VC设置正确的 Storyboard ID(选中VC,在右侧Identity Inspector里设置),和代码里的标识符保持一致。
- 如果你的textField是纯代码创建的,那就在代码初始化textField后直接赋值就行,逻辑是一样的。
内容的提问来源于stack exchange,提问作者user8788401
相关产品推荐
相关产品推荐

