如何使用 swift 4 使 swift 类委托符合 Objective C 类中的要求?

问题描述 投票:0回答:6

假设同一项目中有两个类,一个在 swift 中,另一个在 Objective-C 类中。

在 Swift 类中,我声明了委托,我想将该委托设置为 Objective C 类。

我已经按照以下方式完成了...

import UIKit

@objc public protocol SwiftLoginVCDelegate: class {

}

@objc public class SwiftLoginViewController: UIViewController {

    @IBOutlet var txtUserName: UITextField!
    @IBOutlet var txtPassword: UITextField!
    @IBOutlet var btnLogin: UIButton!
    var delegate: SwiftLoginVCDelegate?

    override public func viewDidLoad() {
        super.viewDidLoad()
        self.txtPassword.text = "XYZ"
        self.txtPassword.text = "123"
        self.btnLogin.backgroundColor = UIColor.blue

    }
 @objc public func testObjective(){
        print("Swift class is integrated in objective c project")
    }

目标 c 类是

#import "Mediator.h"

@class    SwiftLoginViewController;
@protocol SwiftLoginVCDelegate;

@interface LoginMediator : Mediator

@end

实现类是

#import "xyz-Swift.h"

@class SwiftLoginViewController;

@implementation LoginMediator 


-(void)onRegister
{
// line 1:   [(XYZController*)self.viewComponent setDelegate:self];

   line 2 :  [(SwiftLoginViewController*)self.viewComponent setDelegate:self];

       [objectVC testObjective];
}

如果你检查 onRegister 方法,第 1 行委托是使用 Objective c 设置的,现在已注释,但我想在 swift 4 中设置相同的委托,第 2 行,当我尝试在 swift 4 中设置委托时,我是出现以下错误

“SwiftLoginViewController”没有可见的 @interface 声明 选择器“setdelegate”;

注:

我还可以访问中定义的所有变量和函数 快速等级到目标c等级。我无法设置 在 swift 类中声明的 Objective c 类中的委托。

任何人都可以知道我在上面的代码中做错了什么吗?感谢所有意见。

ios objective-c delegates ios11 swift4
6个回答
9
投票

好吧,我用 Objective-C 制作了一个示例项目,然后安装了名为

GPKit
的 Swift 框架,一旦我让它工作,我意识到你没有使用
Cocoapod
。所以我制作了一个示例 Swift 类,然后在我的 Objective-C 类中使用它。

首先,你需要学习如何在 Objective-C 类中正确使用 Swift 文件/类,从这里学习:Can't use Swift classes inside Objective-C

一旦你让它工作起来,确认 Swift 委托并在该委托中实现功能将很容易。

我在您的实现中看到的是,您正在制作一个新的

class
protocol

@class    SwiftLoginViewController;
@protocol SwiftLoginVCDelegate;

这是我专门为这个问题制作的示例代码:

ViewController.m

#import "TestObjcUsingGPKit-Swift.h"
#import "ViewController.h"

@interface ViewController () <CuteDelegate>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    CuteClass *newCutie = [[CuteClass alloc] init];
    newCutie.delegate = self;
}

- (void)myCuteFunc {
    // --- the delegate function
}

@end

CuteClass.swift

import UIKit

@objc public protocol CuteDelegate: NSObjectProtocol {
    @objc func myCuteFunc()
}

public class CuteClass: NSObject {
    weak var delegate: CuteDelegate?
}

GitHub 上为您提供的完整示例项目:https://github.com/glennposadas/UsingSwift-In-ObjectiveC


2
投票

我遇到了和你完全相同的问题。我注意到生成的 -Swift.h 文件没有将 Swift 文件中的弱委托成员暴露给 Objective-C 运行时。您可以通过执行命令并单击 #import -Swift.h 文件来验证这一点,然后搜索 Swift 类名以查看公开了哪些方法/成员。

为了最终解决这个问题,我最终将 @objc 标签添加到我的委托中。在你的情况下,它将是:

@objc weak var delegate: SwiftLoginVCDelegate?

完成此操作后,我再次观察 -Swift.h 文件,你瞧,我的委托被暴露了,我可以按预期在我的目标 c 文件中使用它。

希望这有帮助。


2
投票

@Gleen 响应很好,但你也必须将 @objc 添加到 var delegate

weak var delegate: CuteDelegate?

0
投票

问题来自于使用

setdelegate
而不是
setDelegate
(请参阅小写代表)。

尝试:

[(SwiftLoginViewController*)self.viewComponent setDelegate:self];
// or 
((SwiftLoginViewController*)self.viewComponent).delegate = self;

0
投票

我一直坚持这个问题,直到发现另一个问题:我在 Swift 类定义上有

@objcMembers
,但协议定义位于类定义之外,需要自己的
@objc
注释。


0
投票

万一它对任何人有帮助。让我困惑的是试图将协议引用放入我现有的 Objective-C“ViewController.h”文件 @interface 声明中,因为我在 .h 文件中有很多其他现有的协议和方法定义。

@interface ViewController: UITableViewController <AnotherDelegate, CuteDelegate> {....}  ..... @end

但是,Objective-C 头文件无法看到 Swift 自动生成的头文件(例如“TestObjcUsingGPKit-Swift.h”),因此 XCode 抱怨 CuteDelegate 未定义。最后我发现您还可以在 .m 文件中添加接口声明以及仅在委托声明中添加,如果它看起来像这样:-

@interface () UITableViewController <AnotherDelegate, CuteDelegate>

并且仍然有 .h 文件声明,如下所示:-

@interface ViewController: UITableViewController
© www.soinside.com 2019 - 2024. All rights reserved.