You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:44:05