2012-02-16 17 views
0

私は複数のビューを持つ単純なアプリケーションを開発しています。 私はベースビューと、ベースの後に呼び出される第2ビューを持っています。 ベースビューは、2番目のビューのデリゲートとして機能します。iOS:デリゲートからインスタンス変数の値(プロパティ)を取得

2番目のビューでは、baseView( 'name')のプロパティの値を設定して取得したいと思います。 2番目のビューでは、デリゲートはsecondViewDelegateオブジェクトであるため、 'name'メソッドはありません。

baseView.h(スキップ輸入):

@interface baseView : UIViewController <secondViewDelegate> { 
} 
@property (retain) NSString *name; 

@end 

secondView.h(スキップ輸入):

@protocol secondViewDelegate; 

@interface secondView : UIViewController{ 
} 
@property (nonatomic,assign) id <secondViewDelegate> delegate; 

@end 

@protocol secondViewDelegate 
- (void) secondViewDidFinish:(secondView *)controller; 
@end 

ここで通常のアプローチは何ですか? プロトコルのゲッターとセッターを実際に実装する必要がありますか? Like:

@protocol secondViewDelegate 
- (void) secondViewDidFinish:(secondView *)controller; 
- (NSString *)getName; 
- (void)setName:(NSString *)newName; 
@end 

実際にbaseViewプロパティにアクセスする、または少なくともインスタンスを取得する良い方法はありますか? (それはいい考えですか?)

私はまだiOS開発の新機能がまだ不明です。

答えて

2

デリゲートプロトコル(IMOの良い点)を定義する手間があるので、警告を出す "巧妙な"ソリューションを探すのではなく、設計上の意思決定とプロトコルにプロパティを追加する必要があります離れて。あなたはこのように、プロトコルの宣言に@propertyを使用することができます。

@protocol secondViewDelegate 
@property(retain) NSString* name; 
@end 

それはあなたのプロトコルでプロパティを持っている良い感じdoesnの場合、あなたはおそらく、あなたの設計上の決定を確認する必要があります:何secondViewDelegateが行うことになっている、またはなぜsecondViewはプロパティを設定する必要がありますか?

+0

うん、それだけです!私たちはそれに就いている間に、代議員の議定書なしでこれを行うことができますか? SecondViewは '[self dismissModalViewControllerAnimated:YES];'を呼び出して、これをbaseViewで呼び出すのではなく、 – jpimentel

+0

@jpimentel:私はこれが可能だとは思わない、プレゼンテーションを行うView Controllerも解雇をしなければならない。しかし、これは良いことです。なぜなら、それは責任をひとつのクラスにまとめているからです。しかし、プロトコルを再設計して、それが署名 'secondView:(secondView *)controller didFinishWithName:(NSString *)name'を持つ単一のメソッドで構成されるようにすることができます。 – herzbube

0

-nameまたは-setName:メソッドを単に呼び出すことはできますが、コンパイラの警告が表示されても動作します。 編集:オブジェクトを適切なタイプにキャストすると、警告さえしません。

+0

はい、そうです。しかし、コンパイラの警告は、通常、 "あなたはそれをやるべきではない"と伝えています。 – jpimentel

+0

通常、毎回ではありません。ここで問題となるのはObj-Cの動的な性質です。コンパイラには、特定のクラス/オブジェクトがどのメソッドに応答するかについてのヒントしかありません。それがエラーではなく警告である理由です。ソースからCFLAGS = -Wallを使って、すばらしいコーディングされたUnixのものをビルドしたことがありますか?あなたはたくさんの警告を見た? –

+0

@ H2CO3:だから、あなたは言語があなたと離れていくことができるようにするために、**インターフェースの一部ではなく**のプロパティにアクセスするために、インターフェース(またはプロトコル、Obj-Cを話しているのでプロトコル)を使うことをお勧めしますそれは実行時に? – herzbube

関連する問題