2015-07-20 121 views
0

我正在研究Objective C中幾年前完成的一個iOS項目。所以我必須對現有項目實現一些新功能,使用Swift來達到這個目的。Objective C,由於循環依賴導致的Swift互操作性問題

我添加了一個新雨燕類:

class CampView: UIView 
{ 
    // Code 
} 

我想在我現有的目標C類的一個來訪問這個類。所以我不喜歡:

@class CampView; 
@interface NewCampViewController : UIViewController 

@property (nonatomic, strong) IBOutletCollection(CampView) NSArray *campTypes; 

@end 

但是,當我將它連接到我的故事板,它與消息崩潰:

終止應用程序由於未捕獲的異常「NSUnknownKeyException」, 原因:「[setValue方法:forUndefinedKey:]: 這個類不是關鍵值,它們是關鍵的campTypes的編碼。

而且我可以在我的系統生成的斯威夫特頭文件不導入到這個特殊的班級,當我這樣做,它會引發如下錯誤:

「MyApp的-Swift.h」找不到文件

這就是爲什麼我在上面的代碼片段中使用了@class CampView;。在調查時,我發現我的NewCampViewController.h包含在Objective C橋接頭文件中。所以懷疑這是由於循環依賴,但我無法修復它。

任何人都可以幫我解決這個問題嗎?

+1

異常看起來不像是什麼與Swift依賴關係 - 它看起來像一個簡單的IBOutlet問題。你確定你已經將你的故事板連接到一個IBOutletCollection而不是一個IBOutlet。 – Paulw11

+0

@ Paulw11:我連接到IBOutletConnection。我確定。我嘗試刪除並再次添加 –

回答

5

1)您是否正在從您的Objective-C類的.m文件導入(import "MyApp-Swift.h")?這應該避免循環依賴。如果您在使用@class CampView,Xcode希望您將在.m文件中導入CampView類。 @class基本上只是你的頭文件的強制轉換。

如果您在執行-swift.h導入時收到文件未找到錯誤,請嘗試通過查看此post進行調試。另外,我相信如果您更改項目名稱,則導入名稱可能不會隨之更改。檢查你的模塊的名稱。

如果您仍然認爲您可能從循環導入中找不到此文件,請確認最簡單的方法是將導入添加到另一個您不知道的obj-c文件中有一個循環調用,並初始化一個CampView的測試實例。

2)如果問題出現在@ Paulw11所建議的IB連接中,您可以通過檢查代碼中連接的屬性旁邊的圓點來檢查連接是否生效。點擊它應該顯示它連接到什麼。一個空的點不連接。 enter image description here 有關如何正確建立從IB到您代碼中的屬性的連接的更多信息,請參閱此link

+0

因此我需要在.m文件中聲明屬性? –

+0

如果您使用'@class CampView',則不需要。 '@class'基本上告訴頭文件,讓我聲明類類型CampView的屬性,但不要擔心我要將它導入到.m文件中。 –

+0

嗨@Midhun MP你有沒有想過這個? –