Objective-C与Swift视图控制器间Delegate传值问题咨询
没问题,我帮你梳理清楚OC和Swift控制器之间用Delegate传值的完整流程,尤其是你需要频繁更新字符串的场景,一步步来:
1. 完善Objective-C端的协议与视图控制器
首先把你的objCViewController的协议和代理逻辑补全,核心是定义传递更新字符串的协议方法,并用弱引用代理避免循环引用:
objCViewController.h
#import <UIKit/UIKit.h> // 定义代理协议,用来传递更新后的字符串 @protocol MyDelegate <NSObject> // 单字符串传递示例,如果有多个NSString,可扩展参数 - (void)didUpdateTargetString:(NSString *)newString; // 多字符串场景的方法示例: // - (void)didUpdateStringsWithFirst:(NSString *)str1 second:(NSString *)str2; @end @interface objCViewController : UIViewController // 代理属性必须用weak,防止循环引用 @property (nonatomic, weak) id<MyDelegate> delegate; // 你的NSString变量,这里示例一个 @property (nonatomic, strong) NSString *targetString; // 示例更新字符串并通知代理的方法,你可以在需要更新的时机调用它 - (void)updateStringAndNotifyDelegate; @end
objCViewController.m
#import "objCViewController.h" @implementation objCViewController - (void)updateStringAndNotifyDelegate { // 这里替换成你实际的字符串更新逻辑,比如接口返回、用户输入等 self.targetString = [NSString stringWithFormat:@"最新内容:%@", [NSDate date]]; // 先检查代理是否实现了协议方法,再通知 if ([self.delegate respondsToSelector:@selector(didUpdateTargetString:)]) { [self.delegate didUpdateTargetString:self.targetString]; } } // 示例:每次视图出现时更新字符串(根据你的需求,可在定时器、按钮点击等时机调用) - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self updateStringAndNotifyDelegate]; } @end
2. Swift端配置与代理实现
首先确保你的项目有OC-Swift桥接文件(如果没有,新建OC文件时Xcode会自动提示创建,也可以手动创建),在桥接文件中导入OC的头文件:
#import "objCViewController.h"
然后在SwiftViewController中遵守代理协议,接收OC传来的更新:
import UIKit class SwiftViewController: UIViewController, MyDelegate { // 用来展示更新后字符串的UI元素,示例用UILabel @IBOutlet weak var displayLabel: UILabel! // 示例跳转/获取OC控制器实例的方法 func presentObjCViewController() { let objCVC = objCViewController() // 设置当前Swift控制器为OC控制器的代理 objCVC.delegate = self // 根据你的导航方式跳转(push/present) navigationController?.pushViewController(objCVC, animated: true) } // 实现代理方法,接收OC传来的更新字符串 func didUpdateTargetString(_ newString: String!) { // 更新UI必须在主线程,避免崩溃 DispatchQueue.main.async { self.displayLabel.text = newString } } // 多字符串场景的代理方法实现: // func didUpdateStrings(withFirst str1: String!, second str2: String!) { // DispatchQueue.main.async { // self.label1.text = str1 // self.label2.text = str2 // } // } }
3. 关键注意事项
- 循环引用规避:OC的代理属性必须用
weak,因为Swift控制器会强引用OC控制器,OC如果用strong代理会导致内存泄漏。 - 主线程更新UI:如果你的字符串更新逻辑在子线程执行,代理方法可能也会在子线程触发,此时必须切到主线程更新UI。
- 可选协议方法:如果不想强制所有代理都实现方法,可以在OC协议中给方法加上
@optional修饰,调用前依然要检查代理是否实现了该方法。 - 频繁更新优化:如果是超高频率的更新(比如每秒多次),可以考虑用
NotificationCenter或Swift的Combine框架替代,但Delegate在普通频繁更新场景下完全够用。
内容的提问来源于stack exchange,提问作者Hugo.W
相关产品推荐
相关产品推荐

