2011-12-28 14 views
6

私はXcodeプロジェクトで作業していましたが、2つのクラスが互いに認識しなくなるまで、すべてがうまくいっていました。以下はその抜粋です:Xcodeクラスは互いに見ることができません

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

私はエラー取得するいくつかの理由について「不明なタイプ名 『JBXViewControllerを』;もしかして 『のUIViewController』?」他のクラスを上記の数行だけインポートしているので、これがどのように可能か分かりません。どんな洞察も大いに評価されるだろう!

+0

また、JBXViewController.hでViewController2.hをインポートしていますか? –

+0

"JBXViewController.h"にsmの問題がある必要があります。クラスJBXViewControllerからいくつかの初期コードを投稿できますか? – samfisher

+0

@FirozeLafeerます。#import "ViewController2.h" @interface JBXViewController::私はここにJBXViewController.h – Rob

答えて

11

"お互いに見えない"と言うと、私はあなたのJBXViewController.hにViewController2.hもインポートしているということです。

@class JBXViewController; 

@interface ViewController2 : UIViewController { 
    JBXViewController *jbx; 
} 

そして:だからあなたは1つのヘッダが代わりに再び最初のインポート秒を、インポート最初のヘッダをインポートし、別のヘッダー、...

を輸入している、JBXViewControllerへの前方参照を使用します#import "JBXViewController.h"代わりに(あなたのViewController2.mで)

5

フィローズ・ラフェアの答えは正しいですが、この問題はおそらくあなたのコードのデザインが悪いという症状です。

あなたのアプリケーションでは、JBXViewControllerが親ビューコントローラであり、特定の機能に対してViewController2が表示されることがあります。 (たとえば、JBXViewControllerはレコードのリストを表示し、ViewController2はレコードの1つを編集します)。このような状況では、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のデリゲートを設定する必要があります。たとえば:そうのようなInterface Builderでまたはコードのいずれかで、

@interface JBXViewController : UIViewController <ViewController2Delegate> 

デリゲートを設定します:

@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は、プロトコルに準拠している

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

をし、実装のすべてViewController2Delegateにリストされているメソッド。

  1. ViewController2がJBXViewControllerがどのように動作するかの具体的な知識を必要としない:

    は一緒に、これらの変化は、3つのことを意味します。これは、ViewController2でJBXViewController.hをインポートする必要がなくなったことを意味します。あなたの直面する問題を解決します。

  2. JBXViewControllerがより柔軟になりました。 ViewController2で適切なプロパティを設定し、必要なデリゲートメソッドを実装している限り、JBXViewControllerおよびViewController2で必要なものを変更することはできません。

  3. ViewController2もより柔軟になりました。あなたは、アプリケーションの他の部分からそれを使用したり、別のアプリケーションに移動することができます。 JBXViewControllerとViewController2の間に画面を挿入できます。

これらの変更は、アプリをあなたのデバイスで実行して、意図したとおりに機能させるためには必要ありません。しかし、あなたがこれらのデザインを採用し始めるならば、道のりを簡単にすることができます。

+0

ブレント、私はあなたが正しいと思う。詳細な答えをありがとう、私は間違いなくコードが構造化されている方法を再考します。 – Rob

関連する問題