2017-10-06 110 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文件,使用它如預期。

希望這會有所幫助。

相關問題