Swift-4:Xib自定义UITableViewCell按钮点击无法Push跳转ViewController
解决UITableViewCell按钮点击Push跳转失败的问题
嘿,我来帮你一步步排查这个跳转失效的问题!既然你已经通过代理触发了ViewController的showMoreAboutLeads方法,而且项目根控制器是UINavigationController,那咱们从几个最常见的坑入手:
1. 先确认代理是否真的“连上了”
- 首先在
tableView(_:cellForRowAt:)方法里,一定要给Cell设置代理:cell.delegate = self,同时当前ViewController要遵守你定义的Cell代理协议(比如extension YourViewController: YourCellDelegate)。 - 可以在
showMoreAboutLeads方法里加一行print("代理方法触发了!"),确认按钮点击时确实走到了这个方法里——要是没打印,那问题出在代理绑定或者按钮点击事件上。
2. 检查当前ViewController是否在Navigation栈中
这是最容易踩的坑!就算根控制器是UINavigationController,如果你当前的ViewController是通过present(_:animated:completion:)展示的,那它根本不在导航栈里,调用pushViewController自然没反应。
- 你可以在
showMoreAboutLeads里打印:print(self.navigationController),如果输出是nil,说明当前VC不在导航栈里。- 解决办法:要么把当前VC改成通过导航栈push展示,要么跳转时用
present(_:animated:completion:)代替push(不过更推荐前者,保持导航栈的连贯性)。
- 解决办法:要么把当前VC改成通过导航栈push展示,要么跳转时用
3. 核对跳转代码的正确性
- 确保你正确实例化了目标ViewController:
- 如果目标VC是用Xib创建的,要用
init(nibName:bundle:)初始化:func showMoreAboutLeads(...) { let targetVC = TargetVC(nibName: "TargetVC", bundle: nil) // 先判断导航控制器是否存在 guard let nav = self.navigationController else { print("当前VC不在导航栈,无法push!") return } nav.pushViewController(targetVC, animated: true) } - 如果是Storyboard创建的,要确保正确获取Storyboard实例并通过ID初始化:
let storyboard = UIStoryboard(name: "Main", bundle: nil) let targetVC = storyboard.instantiateViewController(withIdentifier: "TargetVCID") as! TargetVC
- 如果目标VC是用Xib创建的,要用
4. 确认Cell内按钮的点击事件绑定正确
- 在Cell的
awakeFromNib()方法里,要给按钮添加点击事件:
要是按钮没绑定点击事件,代理方法根本不会触发。override func awakeFromNib() { super.awakeFromNib() yourButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside) } @objc private func buttonTapped() { // 调用代理方法 delegate?.showMoreAboutLeads(...) }
5. 排除导航栏隐藏的“假失效”
有时候导航栏被隐藏了,你会误以为没跳转,但其实VC已经push进去了。可以在目标VC的viewDidLoad里加一行:
self.navigationController?.isNavigationBarHidden = false
或者在showMoreAboutLeads里打印导航栈的VC数量:print(self.navigationController?.viewControllers.count),看看跳转后数量是否增加。
按这个顺序排查下来,应该能找到问题所在啦!
内容的提问来源于stack exchange,提问作者A.Yesuvin
相关产品推荐
相关产品推荐

