我已经创建了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.h和SwiftWrapper.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
。
NSObject
。因此,您的协议将类似于:
public protocol ListHandler: NSObject {
func submit(options: String)
func close()
}
SwiftWrapper
类:使用此类不能直接传递handler
给Objective-C类,因此您需要在该类中创建一个可以与Objective-C类进行通信的委托或协议。因此,在此类中创建一个委托:
@objc protocol SwiftWrapperDelgate {
func submit(options: String)
func close()
}
现在,必须在此类中声明protocol
of的方法,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!
}
现在在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] 删除。
我来说两句