如何从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
相关产品推荐
相关产品推荐

