假设在同一项目中有两个类,一个在swift中,另一个在objective-c类中。
在swift类中,我声明了delegate,并希望在目标c类中设置该delegate。
我已经按照以下方式完成了。。。
import UIKit
@objc public protocol SwiftLoginVCDelegate: class {
}
@objc public class SwiftLoginViewController: UIViewController {
@IBOutlet var txtUserName: UITextField!
@IBOutlet var txtPassword: UITextField!
@IBOutlet var btnLogin: UIButton!
var delegate: SwiftLoginVCDelegate?
override public func viewDidLoad() {
super.viewDidLoad()
self.txtPassword.text = "XYZ"
self.txtPassword.text = "123"
self.btnLogin.backgroundColor = UIColor.blue
}
@objc public func testObjective(){
print("Swift class is integrated in objective c project")
}
目标c类是
#import "Mediator.h"
@class SwiftLoginViewController;
@protocol SwiftLoginVCDelegate;
@interface LoginMediator : Mediator
@end
实现类为
#import "xyz-Swift.h"
@class SwiftLoginViewController;
@implementation LoginMediator
-(void)onRegister
{
// line 1: [(XYZController*)self.viewComponent setDelegate:self];
line 2 : [(SwiftLoginViewController*)self.viewComponent setDelegate:self];
[objectVC testObjective];
}
如果你检查onRegister方法,在第1行中,委托是使用目标c设置的,现在已经注释了,但我想在第2行的swift 4中设置相同的委托,当我试图在第4行中设置委托时,我得到了以下错误
"SwiftLoginViewController"没有可见的@接口声明选择器"setdelegate";
注意:
我能够访问中定义的所有var和函数swift类到目标c类。我无法设置在swift类中声明的目标c类中的委托。
有人知道我在上面的代码中做错了什么吗?感谢所有的投入。
好吧,我在Objective-C中做了一个示例项目,然后安装了名为GPKit
的Swift框架,一旦我让它工作起来,我就意识到你没有使用Cocoapod
。所以我制作了一个Swift类示例,然后在Objective-C类中使用它。
首先,你需要学习如何在Objective-C类中正确使用Swift文件/类,从这里学习:Can';不要在Objective-C 中使用Swift类
然后,一旦你开始工作,向Swift委托确认并实现该委托中的功能将很容易。
在您的实现中,我可以看到您正在制作一个新的class
和protocol
。
@class SwiftLoginViewController;
@protocol SwiftLoginVCDelegate;
这是我为这个问题制作的示例代码:
ViewController.m
#import "TestObjcUsingGPKit-Swift.h"
#import "ViewController.h"
@interface ViewController () <CuteDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
CuteClass *newCutie = [[CuteClass alloc] init];
newCutie.delegate = self;
}
- (void)myCuteFunc {
// --- the delegate function
}
@end
CuteClass.swift
import UIKit
@objc public protocol CuteDelegate: NSObjectProtocol {
@objc func myCuteFunc()
}
public class CuteClass: NSObject {
weak var delegate: CuteDelegate?
}
GitHub上为您提供的完整示例项目:https://github.com/glennposadas/UsingSwift-In-ObjectiveC
我遇到了和你完全相同的问题。我注意到生成的-Swift.h文件没有向objective-c运行时公开Swift文件中的弱委托成员。您可以通过执行命令并单击#import-Swift.h文件来验证这一点,然后搜索Swift类名以查看公开了哪些方法/成员。
为了最终解决这个问题,我最终向我的委托添加了@objc标记。在您的情况下,它将是:
@objc weak var delegate: SwiftLoginVCDelegate?
之后,我再次观察了-Swift.h文件,瞧,我的委托被暴露了,我可以像预期的那样在目标c文件中使用它。
希望这能有所帮助。
@Gleen响应很好,但您必须将@objc添加到var delegate too
weak var delegate: CuteDelegate?
问题来自于使用setdelegate
而不是setDelegate
(请参阅小写委托)。
尝试:
[(SwiftLoginViewController*)self.viewComponent setDelegate:self];
// or
((SwiftLoginViewController*)self.viewComponent).delegate = self;
我一直被困在这个问题上,直到我发现了另一个问题:Swift类定义上有@objcMembers
,但协议定义位于类定义之外,需要自己的@objc
注释。