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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:26:35