2009-07-25 3 views
0

このアプローチは、多くのカスタムビューを持つアプリケーション、ネストされたPNGグラフィックス、およびユーザーとのやりとりに基づいて変化するアニメーションのための良い習慣のように見えますか?私はUIViewの継承のためのUIViewとUIViewControllerの練習

@interface BaseView : UIView { 
    @protected 
    BaseViewController *controller; 
} 

@property (retain) BaseViewController *controller; 

@end 

及びIビュー

「drawArea」とはCGRect使用される
@interface BaseViewController : UIViewController { 
    @protected 
    CGRect drawArea; 
} 

- (void) drawArea:(CGRect) _drawArea; 
- (CGRect) drawArea; 
- (void) linkSubviewController: (BaseViewController *) _subviewController; 

@end 

を操作するためのコードを入れています主要位置で対応するコントローラクラスを拡張BaseViewクラスを作成しましたビューとしてフレームとして渡します。次のように

「linkSubviewControllerは」巣にコントローラとビューをことができます:私は「ImageViewの」とUIImageとBaseViewを伸ばすだけでなく、保存する「ImageViewController」と呼ばれる別のカスタムペアを重ねまた

- (void) linkSubviewController: (BaseViewController *) _subviewController { 
    [self.view addSubview:[_subviewController view]]; 
} 

UIImage *image = [(ImageViewController *)self.controller image]; 
CGContextDrawImage(...) etc 
:X、Y、Iはself.controllerのVARSの任意VARSを変更、または画像を割り当て、たとえばされているかどうかを確認することができるビューの "のdrawRect" 描画方法においてH

、W

私はこの

- (void)loadView { 
    ImageView *v = [[ImageView new] initWithFrame:drawArea]; 
    v.controller = self; 
    self.view = v; 
} 

ような何かベース「initWithFrame」ルーチンが

self.backgroundColor = [UIColor clearColor]; 
    self.opaque = NO; 

が含まれているので、私はそれぞれのことを割り当てることなく、透明な背景を持つイメージの多様性をロードすることができloadViewメソッドのメソッドのほとんどを書きます時間。

私はこのコードをアプリケーション全体で使用できました。カスタムアイテムのレイアウトを組み立てるトップレベルのクラスを簡単に作成できるようです。アニメーションの場合、私はそれらをコントローラに入れ、self.view.layerを操作しています。

は基本的に私はフィードバックを探しています、私はObjective-CのとIPhone SDK

答えて

4

でいくつかの問題は、ここに新しいがありますしています:[[Classname new] init...]を使用して

  1. newの間違った使い方です。 newを使用すると、[[Classname alloc] init]の略語なので、効果的にinitを2回呼び出すことになります。
  2. ビューは、誰がそれらを制御しているかを実際に知る必要はありません。
  3. コントローラが表示され、UIViewControllerがそのビューを保持しているため、保持サイクルがあり、どちらも完全にreleaseではありません。

あなたがこの種の動作を(それによってビューは親にその図面を委任することができます)したい場合は、お使いのコントローラがそのプロトコルを実装する必要があり、DrawDelegateプロトコルを作成してみてください、そして、あなたのビューサブクラスの非保持drawDelegateを持っていますプロパティ:

@protocol DrawDelegate 
- (void) drawArea:(CGRect)rect; 
@end 

@interface BaseView : UIView { 
    id<DrawDelegate> drawDelegate; 
} 
@property (assign) id<DrawDelegate> drawDelegate; 
@end 
+0

[[Class alloc] init]より[Class new]を使用する具体的な理由はありますか?明らかに拡張されたinitWithやその他のもの以外。 – Sneakyness

+1

@Sneakyness + newは徐々に死んでいく大会です。 + alloc-initは、+ new *が+ alloc-initを呼び出す必要があるため、+ alloc-initと比べて柔軟性がありません。+ allocを使用すると、好きな-initまたは-initWith ...メソッドを使用できます。 –

+0

ありがとう! +新しいことは明らかな間違いです、ありがとうございます。私は代表団のアプローチを試してみます。私の主な目標は、ステートフルな情報をコントローラに保存し、コントローラの変更に基づいてビューを再描画させ、アプリケーションクラスがコントローラを実行できるようにすることです。また、計画の一部は、カスタムビューからキャストされた.controllerまでタッチイベントを送信できるようにすることでした。明らかにいくつかのリワークが必要ですが、代表団が助けになると思います。 – Michael

関連する問題