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

如何从OC控制器推送Swift控制器并回调数据执行后续方法

解决方案:Objective-C与Swift ViewController间的数据回调

你遇到的协议无法在Objective-C中识别的问题,主要是Swift协议暴露给OC的配置细节没处理到位;同时用Completion Block确实是更适合这类一次性回调场景的方案,我给你两种可行的实现方式:

方案一:修复Delegate/Protocol实现

先解决你原方案中协议无法被OC识别的问题,只需调整Swift代码的访问权限即可:

修改Swift端代码(SecurityQuestionViewController.swift)

// 必须添加public修饰,才能在OC的桥接文件中生成可用的协议声明
@objc public protocol MyProtocol {
    func setResultofSecurityQuestion(valueSent: [NSDictionary])
}

@objc public class SecurityQuestionViewController: UIViewController {
    // delegate用weak修饰避免循环引用,同时加@objc让OC能访问
    @objc weak var delegate: MyProtocol?
    
    @objc func didTapSubmitButton(sender: UIButton){
        let data: [NSDictionary] = getQuesDictionary()
        print(data)
        // 回调数据给代理
        delegate?.setResultofSecurityQuestion(valueSent: data)
        navigationController?.popViewController(animated: true)
    }
}

修改Objective-C端代码(ParentViewController.m)

- (void)sendNextbutton:(id)sender{
    SecurityQuestionViewController *vc = [[SecurityQuestionViewController alloc] init];
    vc.delegate = self;
    [self.navigationController pushViewController:vc animated:YES];
}

// 实现协议方法,在这里获取回调数据并执行后续注册操作
- (void)setResultofSecurityQuestionWithValueSent:(NSArray<NSDictionary *> *)valueSent {
    // 可按需保存返回的数据
    self.securityQuestionData = valueSent;
    // 获取数据后执行注册方法
    [self singupWithSecurityQuestion];
}

关键注意点

  • 确保桥接文件PassSDK-Swift.h在Build Settings的Objective-C Bridging Header中配置了正确路径
  • Swift中的协议和类必须用@objc public修饰,才能被OC正常识别

方案二:使用Completion Block实现回调(更推荐)

对于这种一次性的页面跳转回调,Completion Block比Delegate更简洁直观,无需额外定义协议,实现如下:

修改Swift端代码(SecurityQuestionViewController.swift)

@objc public class SecurityQuestionViewController: UIViewController {
    // 定义逃逸闭包,用于回调数据
    @objc var completionHandler: (([NSDictionary])->Void)?
    
    @objc func didTapSubmitButton(sender: UIButton){
        let data: [NSDictionary] = getQuesDictionary()
        print(data)
        // 调用闭包传递数据
        completionHandler?(data)
        navigationController?.popViewController(animated: true)
    }
}

修改Objective-C端代码(ParentViewController.m)

- (void)sendNextbutton:(id)sender{
    SecurityQuestionViewController *vc = [[SecurityQuestionViewController alloc] init];
    // 设置回调闭包,OC中block语法注意参数和返回值
    vc.completionHandler = ^(NSArray<NSDictionary *> * _Nonnull data) {
        // 获取到返回数据后立即执行注册方法
        [self singupWithSecurityQuestion];
    };
    [self.navigationController pushViewController:vc animated:YES];
}

为什么推荐Block?

  • 无需额外定义协议,代码更紧凑
  • 回调逻辑和跳转逻辑放在同一代码块,可读性更强
  • 适合一次性页面交互场景,避免代理模式可能带来的循环引用风险(Swift中delegate用weak也能避免,但Block写法更简洁)

内容的提问来源于stack exchange,提问作者Reed

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:07:46