2017-10-06 88 views
1

假设swift中有两个类,另一个是同一个项目中的objective-c类。如何使用swift 4在目标c类中符合swift类委托?

在swift类中,我声明了委托,并且我想在目标c类中设置该委托。

我已经这样做了下面的方法...

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设置的,它现在被评论,但我想在swift中设置相同的代表4 ,没有行2,当我尝试设置在SWIFT 4代表我收到以下错误

为“SwiftLoginViewController”不可见@interface声明 选择“setdelegate”;

注:

还有一个我能够访问所有的var和功能 迅速类客观C级定义。我无法设置在swift Class中声明的目标c类中的 Delegate。

任何人都可以知道我在做什么错在上面的代码?所有的投入都赞赏。

回答

0

好吧,我已经在Objective-C中做了一个示例项目,然后安装了名为GPKit的Swift框架,一旦我使其工作,我意识到您没有使用Cocoapod。所以我做了一个示例Swift类,然后在我的Objective-C类中使用它。

首先,你需要学习如何正确使用雨燕的文件/类的Objective-C类里面,从这里学到:Can't use Swift classes inside Objective-C

然后,一旦你得到它的工作,确认到斯威夫特代表和实现该代理中的功能将很容易。

我在您的实施中可以看到的是您正在制作新的class和。

@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。在GitHub上迅速

import UIKit 

@objc public protocol CuteDelegate: NSObjectProtocol { 
    @objc func myCuteFunc() 
} 

public class CuteClass: NSObject { 
    weak var delegate: CuteDelegate? 
} 

完整的范例项目为您提供:https://github.com/glennposadas/UsingSwift-In-ObjectiveC

+0

我已经这样做了,但仍然得到相同的错误“没有可见@interface为'SwiftLoginViewController'声明选择器'setdelegate'; ”我能够访问快速类变量和方法,但我无法设置在Swift类中,在Objective C类中声明委托。 –

+0

一切都已经交给你了!我甚至在这个答案中提供了一个示例项目。您需要学习如何在Objective-C项目中使用Swift类。祝你好运。 – Glenn

0

的问题是使用setdelegate代替setDelegate到来(见小写的代表)。

尝试:

[(SwiftLoginViewController*)self.viewComponent setDelegate:self]; 
// or 
((SwiftLoginViewController*)self.viewComponent).delegate = self; 
+0

仍然收到错误 “在'SwiftLoginViewController *'”“类型的对象上未找到属性'委托' –

0

我有完全相同的问题,因为你。我注意到生成的-Swift.h文件没有将我的Swift文件中的弱委托成员公开到objective-c运行时。您可以通过执行命令并单击您的#import -Swift.h文件来验证此内容,并搜索您的Swift类名称以查看公开的方法/成员。

为了最终解决这个问题,我最终将@objc标签添加到了我的委托中。在你的情况将是:

@objc weak var delegate: SwiftLoginVCDelegate? 

我这样做之后,我又观察了-Swift.h文件,你瞧我的委托被曝光,我能在我的目标C文件,使用它如预期。

希望这会有所帮助。

相关问题