ios - 从 Swift 框架访问委托(delegate)协议(protocol)到 Objective C

标签 ios objective-c swift frameworks delegates

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

现在,我想在 ObjC 中传递/访问委托(delegate)处理程序。

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 View Controller 中,能够显示列表屏幕但无法传递委托(delegate)和处理提交/关闭按钮操作。

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

感谢您的帮助和建议。

谢谢

最佳答案

包装类为您完成工作。让我们在包装类中添加所有函数,这些函数可以管理内部框架类的特性。

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

  1. 为协议(protocol)定义提供协议(protocol)类类型。您可以使用 NSObject

所以你的协议(protocol)将是这样的:

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

所以在这个类中创建一个委托(delegate):

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

现在,必须在此类中声明ListViewControllerprotocol 方法,以便我们可以从这里将其传递给Objective-C。创建一个扩展来监听协议(protocol)方法。

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

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

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

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

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

我在这里为 SwiftWrapperListViewController 创建了全局变量

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

- (void)viewDidLoad {
    [super viewDidLoad];

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

最后创建将在 ListViewController 类的操作中调用的委托(delegate)方法。

- (void)submitWithOptions:(NSString *)options {
    NSLog(@"Submit button tapped");
}

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

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

关于ios - 从 Swift 框架访问委托(delegate)协议(protocol)到 Objective C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57602824/

相关文章:

iphone - 是否有可能对同一个 NSString 使用多个 NSCharacterSet 对象?

ios - Objective-C错误:使用NSArray的单元上的索引路径错误

swift - 将 UIView 置于状态栏上方

javascript - 如何将合金代码转换为经典钛

ios - 将 12 位数字刻度转换为日期

ios - 每当我旋转 iPhone(或 Safari 窗口大小越过断点)时,HTML 元素都会增长

Objective-C 属性,它们是如何工作的?

ios - 如何将视频文件保存到文档目录

ios - 为什么 Interface Builder 不在身份检查器中显示 View Controller 子类?

ios - 在 iOS 上使用 Crashlytics 是否需要 Firebase pod?