【问题标题】:How to conform swift class delegate in objective c Class using swift 4?如何使用 swift 4 在目标 c 类中符合 swift 类委托?
【发布时间】:2017-10-06 06:42:03
【问题描述】:

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

在 swift 类中我声明了委托,我想在目标 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 行委托使用目标 c 设置,现在已注释,但我想在 swift 4 中设置相同的委托,第 2 行,当我尝试在 swift 4 中设置委托时我收到以下错误

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

注意:

另外一个我可以访问定义的所有 var 和函数 快速类到目标 c 类。我无法设置 在swift Class中声明的objective c Class中的委托。

谁能知道我在上面的代码中做错了什么?感谢所有输入。

【问题讨论】:

  • @objc weak public var delegate: SwiftLoginVCDelegate?

标签: ios objective-c delegates ios11 swift4


【解决方案1】:

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

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

然后,一旦你开始工作,向 Swift 委托确认并在该委托中实现功能将很容易。

我在您的实现中看到的是您正在创建一个新的classprotocol

@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

【讨论】:

  • 我已经这样做了,但仍然收到相同的错误“'SwiftLoginViewController' 没有可见的@interface 声明选择器'setdelegate';”我能够访问 swift 类变量和方法,但我是无法在目标 C 类中设置在 swift Class 中声明的委托。
  • 一切都已经给你了!我什至在这个答案中提供了一个示例项目。你需要学习如何在 Objective-C 项目中使用 Swift 类。祝你好运。
【解决方案2】:

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

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

@objc weak var delegate: SwiftLoginVCDelegate?

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    @Gleen 响应很好,但您也必须将 @objc 添加到 var 委托

    weak var delegate: CuteDelegate?
    

    【讨论】:

      【解决方案4】:

      问题来自使用setdelegate 而不是setDelegate(请参阅小写代表)。

      试试:

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

      【讨论】:

      • 仍然收到错误“在'SwiftLoginViewController *'类型的对象上找不到属性'delegate'””
      【解决方案5】:

      我一直坚持这一点,直到我发现另一个问题:我在 Swift 类定义中有 @objcMembers,但协议定义位于类定义之外,需要自己的 @objc 注释。

      【讨论】:

        猜你喜欢
        • 2015-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-16
        • 1970-01-01
        • 2021-02-15
        相关资源
        最近更新 更多