2012-01-19 10 views
4

作成したカスタムビューの動作を管理するためにクラスコントローラを作成する必要があります。 標準的なアプローチは、のUIViewControllerをサブクラス化することであるが、私の場合は、代わりに、基本的に3つの理由 サブクラスNSObjectのに決めた: サブクラスUIViewControllerまたはビューがフルスクリーンでないときにカスタムNSObjectを作成

    私のビューは、メインビュー・コントローラの小さなサブビューとして追加する必要が
  • (そうではないであろうpresentModalViewControllerまたはpushViewController ...のようなものを使用して表示されます)。その中にはツールバーやナビゲーションコントロールは一切必要ありません。
  • 私のコントローラは、常にそのビューが使用されるためデバイスの向きについて通知する必要はありません私は通常の回転メッセージwillRotateToInterfaceOrientationなどを受け取ることに興味がないので、ポートレート形式で。
  • 私は、このクラスを可能な限り軽量にして、メモリ消費を最小限に抑える必要があります。私は

私のコントローラのインタフェースを使用する必要はありません方法の束ずに軽いクラスを取得する利点を持っているのUIViewControllerをサブクラスではないが、非常に簡単です、例:

@interface MyScrollTabBarController : NSObject <MyTabBarViewDelegate> { } 

/** 
* The view is created internally by the controller and the client class 
* can access to it in readonly mode 
*/ 
@property (nonatomic, readonly) UIView *view; 

/** 
* A Property to change the view appearance 
*/ 
@property (nonatomic, assign) MyScrollTabBarViewState viewState; 

/** 
* Others properties used to construct the view's subviews 
*/ 
@property (nonatomic, retain) Location *rootLocation; 
@property (nonatomic, readonly, retain) Place *place; 

/** 
* Designated initializer 
*/ 
- (id)initWithPlace:(Place *)aPlace; 

- (void)setRootLocation:(Location *)location animated:(BOOL)animated; 

@end 

は表示するには、その親ビューコントローラから内部眺め、私はこのようなものを使用します:私はあなたがそれに欠点があるかもしれないと思われる場合、あなたは私の選択についてどう思いますか知りたい

tabBarController = [[MyScrollTabBarController alloc] initWithPlace:aPlace]; 
tabBarController.viewState = MyScrollTabBarViewStateXX; 
tabBarController.view.frame = CGRectMake(...); 
[self.view addSubview:tabBarController.view]; 

をし、何をすべきかあなたは通常、私のようなフルスクリーンではないビュー用のコントローラを書く必要があるときに行います。

ありがとうございました

答えて

1

はい、これが正しい方法です。

UIViewControllerは、特に、サブ画面ではなくフルスクリーン表示を制御するためのものです。 iOS5には、このようにサブ画面のビューコントローラを作成する仕組みがありますが、iOS4ではそれほど多くのハッカーがいないため利用できません。

ビューとコントローラが本質的に結合されている場合は、独自のコントローラであるカスタムビューサブクラスを作成することも考えられます。たとえば、独自のデータを管理する自己完結型のテーブルビューサブクラスを持つことができます。ちょうどページにドロップされます。

+0

Heh ... fzwoが最初にそこに着いた。 –

+0

残念ながら、私のアプリケーションはiOS 4を後でサポートする必要があるので、新しいiOS5の機能を利用することはできません。 – ggould75

+0

はい、そうでした。そのため、NSObjectを使用するか、独自のコントローラとしてビューを使用するのが正しいアプローチです。 –

1

私はこれが受け入れられる解決策だと思います。

もう1つの解決策は、(例えば、MKMapView、UITextViewなどのように)自身を制御する「太った」ビューを作成することです。これにより、管理が容易になり、ビューが非常に特殊化され、そのコントローラがこの1つのクラスのビューでのみ動作するようになっている場合は、(あまりないので)再利用性を失うことはありません。

+0

として参照することができます。コントローラを使用するのではなく、「太い」ビューにすべてを埋め込むことは、おそらくメモリ警告とviewDidUnloadの状況を単純化します。コントローラ(NSObjectから継承した場合)では、通常、メインコントローラから発生したすべてのviewDidUnloadイベントをコントローラに転送する必要があります。一方、私は単純なself.myView = nilを行うことができますカスタム脂肪ビューを使用して; – ggould75

0

あなたはあなたのビューがフルスクリーンで表示されていないことが重要ではありません鉱山

のようにフルスクリーンされていないビューのためのコントローラを記述する必要があるときに、通常は何をしますか。それぞれ独自のコントローラを持つサブビューからなるビューを持つことは可能です(通常は)。

私はこのクラスを可能な限り軽量にして、メモリ消費を最小限に抑える必要があります。ないのUIViewControllerのサブクラスは、私は、メモリの不合理な量を消費しない

サブクラスのUIViewControllerを使用する必要はありません方法の束ずに軽いクラスを取得する利点を持っているので、これは対価の一部であってはなりません。

[...]あなたのソリューションあなた緩い柔軟性と

[...]それに欠点があるかもしれないと思われる場合。 UILifecyle-Messagesに応答する必要がある場合、または他のUIViewController機能を使用する必要がある場合には、ソリューションを再利用する可能性があります。

ビューが軽量である場合は、UIViewサブクラスを使用し、ビューの背後にあるロジックに対してデリゲートを使用することを検討できます。

+1

UIViewControllersを非フルスクリーン表示に使用することは、iOS 5より前ではサポートされていません.iOS 5でも例外ではなく、適切な状況でそれを行うべきではないと言っているわけではありません。この場合は*できます(iOS 4との互換性が必要ない場合)が、魅力的な理由はありません。 ビューは非常に特殊化されている可能性が高いため、柔軟性はおそらくこの場合考慮しません。したがって、他の場所で再利用されることはありません。また、カスタムUIViewControllerの代わりにカスタムNSObjectコントーラを使用することは、ドキュメントで明示的に推奨されています。 – fzwo

+0

fzwo、どこに書類を読んだことがありますか?私はそれをお読みしたいと思います – ggould75

+0

このドキュメントのページ下部の警告を参照してください:http://developer.apple.com/library/ios/#featuredarticles/ViewControllerPGforiPhoneOS/UserApplication/UserViewController in YourApplication/UserApplication.htmlのViewControllerを使用してください –

0

こんにちはあなたはNSObjectのサブクラスを、私はあなたが追加のビューオブジェクトを宣言する必要はありませんので、あなたは、UIViewのサブクラスをすべきである提案すること

@interface MyScrollTabBarController : NSObject <MyTabBarViewDelegate> { } 

@property (nonatomic, readonly) UIView *view; 

内のUIViewを宣言しています。

ので、代わりのself.viewあなたは単にはい、これは私が考えていた他の可能性であるself

tabBarController = [[MyScrollTabBarController alloc] initWithPlace:aPlace]; 
tabBarController.viewState = MyScrollTabBarViewStateXX; 
tabBarController.frame = CGRectMake(...); 
[self.view addSubview:tabBarController]; 
関連する問題