2011-01-01 5 views
1

iPhone/iPadの開発では初心者の方が多いので、これが奇妙な質問のようであれば私を許してください。の@implementation別々の.mファイルでiPhone/iPadイベントハンドラを分離し、#importationでそれらをインポートすることは合理的ですか?

、その後、別の.mファイルにコールバックをUIViewController内のビュー内のほとんどのオブジェクト(またはオブジェクトのグループ)は、イベントのコールバックが定義されている必要があり、それがグループに合理的と思われることを考えると#importそれらをviewcontroller?

この方法では、標準的な方法、私nitWithNibName:-viewDidLoadshouldAutoRotateInterfaceOrientation:didReceiveMemoryWarning:-viewDidUnloadと(Xcodeのによって提供される)にdeallocは、あなたのviewcontroller.mファイルで定義された唯一の方法だろう。 viewcontroller.mファイルは、このイベント・コールバックのモノリシックな怪物にならず、メンテナンスも簡単です。私はあなたがあなたの@synthesize店の後ろに置くと思っています。

思考?

+0

iPhone/iPad開発について学ぶ1ヶ月を費やした後、おそらくAppleの開発者が同じコードを書いたコードの大半は、単一のviewcontroller.mファイルを使用しています。プラグマステートメントを追加すると、当面はDarren'sが一番簡単で最善のアプローチに見えます。私はジャスティンのアプローチが好きです。これがより良くなると、私は自分のやり方を実装するかもしれません。あなたの答えはありがとうございました。 – KevinS

答えて

0

モノリシックなファイルを作成しているように見えるかもしれませんが、ViewControllerは実際にはこのすべての場所です。あなたが提案したことをすれば(それは完全に可能です)、あなたはほとんど何もしないファイルの束で終わるでしょう。大きなファイルで整理維持する

一つの方法は、そのようなプラグママークとメソッドの別々のグループにある:

#pragma mark lifecycle methods 

-(void)dealloc{} 
-(id)init{} 
-(id)initWithCoder: 

#pragma mark target-action 

-(id)doSomethingAction:(id)sender{} 
-(id)doSometingElse:(id)sender{} 

Xcodeはプラグママークやグループにプルダウン項目バーにあなたのためのメソッドを解析します簡単にアクセスできます。このリストのメソッドもアルファベット順にリストされています。

+0

ダーレン、これは私が持っていた考えと、ViewController.mがこのコードの場所であるというあなたの考えの間の妥協点かもしれません。 – KevinS

0

はここで、これはにObjCカテゴリを使用して、一つの代替の実例です:

/* File: Header A */ 
@interface MONViewController : NSViewController 
{ 
    unsigned anIvar; 
} 

@property (nonatomic, readonly) unsigned anIvar; 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle; 
- (void)dealloc; 

- (void)viewDidLoad; 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; 

/* (continued) */ 

@end 

/* File: Header A or Header B, depending on how you want to organize it */ 

@interface MONViewController (EventCallbacks) 

- (IBAction)triviaButtonWasPressed:(id)sender; 

/* (continued) */ 

@end 

/* File: Imp A */ 
@implementation MONViewController 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle { /* ... */ } 
- (void)dealloc { /* ... */ } 
- (unsigned)anIvar { /* ... */ } 

- (void)viewDidLoad { /* ... */ } 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { /* ... */ } 

/* (continued) */ 

@end 

/* File: Imp A or Imp B, depending on how you want to organize it */ 

@implementation MONViewController (EventCallbacks) 

- (IBAction)triviaButtonWasPressed:(id)sender { /* ... */ } 

/* (continued) */ 

@end 

幸い、コンパイラはカテゴリがクラスで実行されるので、定義されたときにすべてのあなたの宣言を定義したことを確認します。プロトコルのような適切なクラス実装で定義されなければならないものがいくつかあります。

これを1トンの小さなファイルに分割すると気をつけます。ビルド時間が実際に苦しんでいる可能性があります。また、このケースでは(あなたのサブクラス化から)、いくらか避けられないが、この点に関するスケーラビリティの問題は、インターフェイス/クラスがあまりにも多くのことを試みていることを通知する役割を果たすため、小さなコンポーネントに分割する必要があります。がんばろう!

+0

ジャスティン、私はそれの周りに私の頭を得るために、この近くを見なければならないだろう。だから私はこれを正しく理解し、MONViewControllerに追加された(EventCallbacks)を使用して、自分のUIコールバックからデフォルトのコールバックを分離し、別々の.mと.hファイルに入れて、選択すればすべてが動作し、 Imp AとImp Bファイルの両方が@implementation MONViewControllerを参照していますが、私はまだコンセントにアクセスできますか?または@interfaceで@propertyを定義しているかどうかを知る必要がありますか?私が*どこに定義するのかを知る必要があるように見えます。 – KevinS

+0

はい、コンパイラは、宣言されたメソッドまたはプロパティを定義していないと警告します。だから... triviaButtonWasPressed: 'とインターフェース/カテゴリで宣言されたものはすべて、対応する@implementationで定義されなければなりません。カテゴリ内のプロパティを宣言することができます - IBがそれらのヘッダーを見つけることができると仮定すると(例えば、プロジェクトにあり、解析可能であること)、アクションとアウトレットが利用可能でなければなりません。警告:複数のインタフェースで同じメソッドを定義しているかどうかをコンパイラが警告したりチェックしたりすることができません。両方の実装でviewDidLoadを定義することができます。これはおそらくUBです。愚かな – justin

0

私はそれらを分けて見ている問題は、ほとんどのコールバックはクラスローカル変数で動作する必要があり、あなたが作業している@implementationのための対応するヘッダーファイルでそれらを宣言するのが手軽だということです。私には、ビューコントローラにイベント処理のものを残して、他の機能をいくつかの別のファイルに移しておく方が理にかなっています...

しかし、何かブレークアウトする場合も同じクラスインスタンス変数これは、あなたが他にはないかもしれないいくつかのクラス変数をpublicにしなければならないかもしれないことを意味します。

ジャスティンでは、この問題を解決しましたが、技術的に「見る」ことができないクラスインスタンス変数を使用することで、私は奇妙に思えます。

+0

Kendall、.mファイルは#import'dであり、別々にコンパイルされないので、viewcontroller.mファイルにあるすべての変数にアクセスできます。彼らはちょうど.hファイルのように振る舞い、viewcontroller.mファイルの残りの部分を掘り下げません。 – KevinS

+0

私は彼らにアクセス権があることを知っています。クラス内部変数を使用するカテゴリを持つのは悪いフォームです。また、すぐに対応するヘッダーファイルに切り替えることができないときにも迷惑をかけることができます(プロトコルの実装ファイルに入っているときに、XCodeヘッダーの切り替えコマンドが "実際の"インターフェイスファイル) –

+0

良い点。ありがとう。私はジャスティンが思いついた提案は、行く方法かもしれないと思うが、私の質問に答えたあなたの入力と時間に感謝します。 – KevinS

関連する問題