Swift 4中Delegate代理无法工作问题排查求助
排查代理方法未执行的问题
看起来你遇到的核心问题是代理对象没有被正确赋值,而且调用代理方法的顺序不对,这也是Swift代理模式中最常见的坑之一,我来帮你一步步梳理:
1. 先修正命名规范(避免混淆)
Swift中属性和方法名建议以小写字母开头,类和协议名以大写开头,这样能避免和类型名混淆。先调整你的代码:
// ViewController 中修正协议和属性名 protocol SearchResultDelegate { func sendDataToResultController(_ result: [SkelbimasModel]) } class ViewController: UIViewController, UISearchBarDelegate, CLLocationManagerDelegate, MKMapViewDelegate, AddSkelbimas { // 小写开头的代理属性 var delegate: SearchResultDelegate? // ... 其他代码 if result.count > 1 { // 修正方法名 delegate?.sendDataToResultController(result) goToSearchResultVC(result) } } // SearchResultTableViewController 中修正方法名 class SearchResultTableViewController: UITableViewController, SearchResultDelegate { var results: [SkelbimasModel] = [] func sendDataToResultController(_ result: [SkelbimasModel]) { print("result count: \(result.count)") results = result } }
2. 核心问题:代理对象未赋值 + 调用顺序错误
你的代码现在的执行顺序是:
调用代理方法 → 创建并跳转目标VC
但这时候delegate属性还是nil(因为目标VC还没被创建),Swift的可选链机制会直接忽略这个调用,方法自然不会执行。
解决方法:调整顺序,先创建VC再设置代理、调用方法
你需要修改跳转逻辑,确保先初始化SearchResultTableViewController实例,再把它赋值给delegate,最后调用代理方法。
举个具体的修改示例:
// 在 ViewController 中修改跳转方法,返回创建好的VC func goToSearchResultVC(_ result: [SkelbimasModel]) -> SearchResultTableViewController { // 替换成你实际的VC初始化方式(比如故事板或代码创建) let storyboard = UIStoryboard(name: "Main", bundle: nil) let searchResultVC = storyboard.instantiateViewController(withIdentifier: "SearchResultTableViewController") as! SearchResultTableViewController return searchResultVC } // 原来的判断逻辑修改成: if result.count > 1 { // 1. 先创建目标VC实例 let searchResultVC = goToSearchResultVC(result) // 2. 设置代理为刚创建的VC self.delegate = searchResultVC // 3. 调用代理方法传递数据 delegate?.sendDataToResultController(result) // 4. 执行跳转 navigationController?.pushViewController(searchResultVC, animated: true) }
或者你也可以把所有逻辑封装在跳转方法里:
func goToSearchResultVC(_ result: [SkelbimasModel]) { let searchResultVC = // 初始化你的VC // 设置代理 self.delegate = searchResultVC // 先传递数据 self.delegate?.sendDataToResultController(result) // 再跳转 navigationController?.pushViewController(searchResultVC, animated: true) } // 调用时直接: if result.count > 1 { goToSearchResultVC(result) }
3. 额外检查项
- 确保
SearchResultTableViewController确实正确遵守了SearchResultDelegate协议,并且方法签名完全一致(包括参数类型、方法名大小写、下划线位置等)。 - 如果用的是
present模态跳转,也要保证VC初始化正确,代理赋值逻辑和上面一致。 - 可以在调用代理方法前加打印:
print(delegate),如果输出nil,就说明代理对象确实没被正确赋值。
内容的提问来源于stack exchange,提问作者user8906418
相关产品推荐
相关产品推荐

