我已经创建了 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.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 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
开始。
- 为协议(protocol)定义提供协议(protocol)类类型。您可以使用
NSObject
。
所以你的协议(protocol)将是这样的:
public protocol ListHandler: NSObject {
func submit(options: String)
func close()
}
SwiftWrapper
类:使用此类不能直接将handler
传递给Objective-C 类,因此您需要在此类中创建一个可以通信的委托(delegate)或协议(protocol)使用 Objective-C 类。
所以在这个类中创建一个委托(delegate):
@objc protocol SwiftWrapperDelgate {
func submit(options: String)
func close()
}
现在,必须在此类中声明ListViewController
的protocol
方法,以便我们可以从这里将其传递给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!
}
现在在 Objective-C
ViewController.m
文件中分配SwiftWrapper
类的委托(delegate)@interface ViewController () <SwiftWrapperDelgate> @property (nonatomic, strong) SwiftWrapper *wrapper; @property (nonatomic, strong) ListViewController *controller; @end
我在这里为 SwiftWrapper
和 ListViewController
创建了全局变量
在 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/