从 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.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 视图控制器中,能够显示列表屏幕但无法传递委托和处理 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
.
开始
- 为协议定义提供协议 class 类型。您可以使用
NSObject
.
所以你的协议将是这样的:
public protocol ListHandler: NSObject {
func submit(options: String)
func close()
}
SwiftWrapper
class:使用这个class你不能直接将handler
传递给Objective-C classes,所以你需要在此 class 中创建一个委托或协议,它可以与 Objective-C classes 通信。
因此在此class中创建一个代表:
@objc protocol SwiftWrapperDelgate {
func submit(options: String)
func close()
}
现在,ListViewController
的 protocol
方法必须在此 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!
}
现在在 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");
}
按照以下步骤实现您的要求。
我已经创建了 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.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 视图控制器中,能够显示列表屏幕但无法传递委托和处理 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
.
- 为协议定义提供协议 class 类型。您可以使用
NSObject
.
所以你的协议将是这样的:
public protocol ListHandler: NSObject {
func submit(options: String)
func close()
}
SwiftWrapper
class:使用这个class你不能直接将handler
传递给Objective-C classes,所以你需要在此 class 中创建一个委托或协议,它可以与 Objective-C classes 通信。
因此在此class中创建一个代表:
@objc protocol SwiftWrapperDelgate {
func submit(options: String)
func close()
}
现在,ListViewController
的 protocol
方法必须在此 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!
}
现在在 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");
}
按照以下步骤实现您的要求。