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

夏尔·瓦尼(Harshal Wani)

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

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

Swift Framework包含“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视图控制器中,能够显示“列表”屏幕,但不能传递委托并处理提交/关闭按钮动作。

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. 为协议定义提供协议类类型。您可以使用NSObject

因此,您的协议将类似于:

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

因此,在此类中创建一个委托:

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

现在,必须在此类中声明protocolof方法,ListViewController以便我们可以从此处将其传递给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-CViewController.m文件中分配SwiftWrapper类的委托

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

在这里,我为SwiftWrapper创建了全局变量ListViewController

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

- (void)viewDidLoad {
    [super viewDidLoad];

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

并且,最后创建将在ListViewController类的操作上调用的委托方法

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

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章