2011-12-28 32 views
6

我正在研究Xcode項目,一切都很順利,直到我的兩個類停止識別對方。下面是摘錄:Xcode類不能「看到」另一個

#import "JBXViewController.h" 
@interface ViewController2 : UIViewController { 
    JBXViewController *jbx; 
} 

出於某種原因,我得到的錯誤「未知類型名‘JBXViewController’;你的意思‘的UIViewController’?」我不明白這是怎麼可能的,因爲我只是在上面幾行輸入其他類。任何見解都將非常感謝!

+0

你還在JBXViewController.h中導入ViewController2.h嗎? – 2011-12-28 06:54:27

+0

必須有「JBXViewController.h」的sm問題。你可以發佈JBXViewController類的一些初始代碼嗎? – samfisher 2011-12-28 06:54:36

+0

@FirozeLafeer:我在JBXViewController.h – Rob 2011-12-28 06:58:02

回答

11

當你說他們「看不到對方」時,我假設你的意思是你還在你的JBXViewController.h中導入了ViewController2.h。所以,你有一個頭導入另一頭,其中進口第一首部,其中進口第二,其中進口又是第一個......

相反,使用前向引用JBXViewController:

@class JBXViewController; 

@interface ViewController2 : UIViewController { 
    JBXViewController *jbx; 
} 

然後代替#import "JBXViewController.h"(在您的ViewController2.m中)

5

Firoze Lafeer的回答是正確的,但是這個問題可能是代碼中糟糕設計的一個症狀。

我認爲,在您的應用程序中,JBXViewController是父視圖控制器,它有時會爲某些特定功能顯示ViewController2。 (例如,JBXViewController顯示記錄列表,而ViewController2編輯其中一個記錄。)在這種情況下,ViewController2不應該知道JBXViewController的細節。相反,JBXViewController應該通過ViewController2的屬性爲ViewController2提供它需要的數據,如果ViewController2必須在JBXViewController上調用方法,它們應該是委託協議的一部分。

例如,假設JBXViewController目前有以下屬性,ViewController2訪問它:

@property (strong) JBXObject * currentObject; 

而應該有ViewController2一個currentObject屬性,JBXViewController顯示視圖控制器前,應設置:

self.myViewController2.currentObject = self.currentObject; 
[self.navigationController pushViewController:self.myViewController2 animated:YES]; 

這適用於單向通信 - JBXViewController可以給ViewController2數據。如果數據需要返回到JBXViewController(除了通過更改currentObject的屬性),您應該爲ViewController2設置一個委託。例如:

@protocol ViewController2Delegate; // forward declaration 
@interface ViewController2 : UIViewController 
@property (weak) id <ViewController2Delegate> delegate; 
... 
@end 

@protocol ViewController2Delegate <NSObject> 
- (void)viewController2ShouldSave:(ViewController2*)viewController2; 
- (BOOL)viewController2:(ViewController2*)viewController2 shouldAddSomoflange:(JBXSomoflange*)aSomoflange; 
@end 

然後讓JBXViewController符合協議:

@interface JBXViewController : UIViewController <ViewController2Delegate> 

設置委託,無論是在界面生成器或代碼如下所示:

self.myViewController2.delegate = self; 
self.myViewController2.currentObject = self.currentObject; 
[self.navigationController pushViewController:self.myViewController2 animated:YES]; 

而且全部落實在ViewController2Delegate中列出的方法。

總之,這些變化意味着三兩件事:

  1. ViewController2不需要的JBXViewController如何工作的具體知識。這意味着您不再需要在ViewController2中導入JBXViewController.h。h,它解決了你眼前的問題。

  2. JBXViewController現在更加靈活。只要它在ViewController2中設置了適當的屬性並實現了任何必要的委託方法,就可以在JBXViewController中更改任何你想要的,並且ViewController2永遠不會知道或關心它。

  3. ViewController2現在更靈活了。您可以從應用程序的其他部分使用它,或將其移至其他應用程序。您可以在JBXViewController和ViewController2之間插入一個屏幕。

這些更改不需要讓應用程序在您的設備上運行並按照您的打算運行。但是如果你開始採用這些設計,你將會有更輕鬆的時間。

+0

布倫特,我懷疑你是對的。感謝您提供詳細的答案,我一定會重新考慮代碼的結構。 – Rob 2011-12-30 22:22:22

相關問題