从 Swift 框架访问委托协议到 Objective C

Access delegate protocol from Swift framework into Objective C

我已经创建了 Swift 框架并集成到 ObjC 项目中。

现在,我想 pass/access 在 ObjC 中委派处理程序。

Swift 框架包含 UIViewController 以及关闭和提交按钮。

ListViewController.swift SwiftFramework

public protocol ListHandler {
    func submit(options: String)
    func close()
}

public class ListViewController: UIViewController {

    public var handler: ListHandler?

    @objc func dismiss(_ sender: UIButton) {
        handler?.close()
    }

    @objc func submit(_ sender: UIButton) {
        handler?.submit(options: "Done")
    }
}

已创建 MyApp-Bridginh-Header.hSwiftWrapper.swift 显示 ListViewController

import SwiftFramework

@objc public class SwiftWrapper: NSObject {

    @objc public var controller: ListViewController?

    override init() {
        print("Working")
    }

    @objc public func showListScreen() -> UIViewController {

        self.controller = ListViewController(title: "List")

        /*
          IMPORTANT: How I can pass this to ObjC called controller?
        */
        // self.controller?.handler =
        return self.controller!
    }
}

终于在 objC 视图控制器中,能够显示列表屏幕但无法传递委托和处理 submit/close 按钮操作。

ProductListViewController.m

#import "MyApp-Swift.h"

SwiftWrapper *wrapper = [[SwiftWrapper  alloc] init];

UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:[wrapper showListScreen]];
[self presentViewController:navController animated:YES completion:nil];

如何访问这里?

示例项目存储库: Swift 框架:https://github.com/harshal-wani/SwiftListFramework ObjC 项目:https://github.com/harshal-wani/SwiftFrameworkDelegateExample

感谢您的帮助和建议。

谢谢

继续评论,您应该制定与 objective-c 一起使用的协议 开始于:

@objc public protocol ListHandler {
    func submit(options: String)
    func close()
}

那你就可以

@objc public var handler: ListHandler?

包装器 class 为您完成工作。让我们在 wrapper class 中添加所有功能,它可以管理内部框架 class 功能。

查看源代码后,您需要对所有 classes 进行大量更改。让我们从 ListViewController.

开始
  1. 为协议定义提供协议 class 类型。您可以使用 NSObject.

所以你的协议将是这样的:

public protocol ListHandler: NSObject {
    func submit(options: String)
    func close()
}
  1. SwiftWrapper class:使用这个class你不能直接将handler传递给Objective-C classes,所以你需要在此 class 中创建一个委托或协议,它可以与 Objective-C classes 通信。

因此在此class中创建一个代表:

@objc protocol SwiftWrapperDelgate {
    func submit(options: String)
    func close()
}

现在,ListViewControllerprotocol 方法必须在此 class 中声明,以便我们可以将其从此处传递给 Objective-C。创建一个 extension 来监听协议方法。

extension SwiftWrapper : ListHandler {
    public func submit(options: String) {
        self.delegate?.submit(options: options)
    }

    public func close() {
        self.delegate?.close()
    }
}

并且,不要忘记在 showListscreen() 函数中分配委托,否则此方法将不会调用。

@objc public func showListscreen() -> UIViewController {
    self.controller = ListViewController(title: "Demo List")
    self.controller?.handler = self
    return self.controller!
}
  1. 现在在 Objective-C ViewController.m 文件中分配 SwiftWrapper class

    的委托
    @interface ViewController () <SwiftWrapperDelgate>
    
    @property (nonatomic, strong) SwiftWrapper *wrapper;
    @property (nonatomic, strong) ListViewController *controller;
    
    @end
    

这里我为 SwiftWrapper & ListViewController

创建了全局变量

viewDidLoad() 中创建 SwiftWrapper class 的对象并将其委托给 self.

- (void)viewDidLoad {
    [super viewDidLoad];

    self.wrapper = [SwiftWrapper new];
    self.wrapper.delegate = self;
}

最后创建将在 ListViewController class.

的操作中调用的委托方法
- (void)submitWithOptions:(NSString *)options {
    NSLog(@"Submit button tapped");
}

- (void) close {
    NSLog(@"Close button tapped");
}

按照以下步骤实现您的要求。