2013-07-22 10 views
6

問題

私はUIViewをサブクラス化しました。このサブクラスのオブジェクトがスーパービューに追加された後、自律的にいくつかのコードを実行する必要があります。コードを実行するためにこのイベントにどのように繋ぐことができますか?UIViewはスーパービューに追加されたときにどのようにコールバックを取得できますか?

私はそれが必要な理由

UISegmentedControlの選択セグメント化の背景には、スタイルに悪名高く困難でした。私は見つけることができる最善の解決策は、このハックをやっている:

#import "SegmentedControlStyled.h" 

@implementation SegmentedControlStyled 

- (void) updateStyle 
{ 
    for (NSUInteger i = 0; i < [self.subviews count]; i++) { 
     if ([[self.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[self.subviews objectAtIndex:i] isSelected]) { 
      [[self.subviews objectAtIndex:i] setTintColor:[UIColor colorWithWhite:0.7 alpha:1.0]]; 
     } 
     if ([[self.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[self.subviews objectAtIndex:i] isSelected]) { 
      [[self.subviews objectAtIndex:i] setTintColor:[UIColor colorWithWhite:0.9 alpha:1.0]]; 
     } 
    } 
} 

@end 

このupdateStyle関数は、2つの場所で呼び出す必要があります。明らかに、最初は、ユーザーが別のセグメントをタップするたびに発生します。 SegmentedControlStyledaddTarget関数をオーバーライドしてUIControlEventValueChangedイベントにフックすることで、これを自律的に行​​うことができます。 2番目の場所updateStyleはの後にと呼ばれ、SegmentedControlStyledがそのスーパービューに追加されます。あなたは、 "なぜそれを後で呼び、initのようなものではないのですか?"と尋ねるかもしれません。まあ、私の観察から、それがビューに添付される前にそれを呼び出すことは効果がありません。したがって、1はこのように自分のコードを記述する必要があります。私のサブクラスを使用して、同僚はビューが壊れている理由を理解しなければならないとするときupdateStyleを呼び出すために知っている必要があるため

SegmentedControlStyled* seg = [[SegmentedControlStyled alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", nil]]; 
[self.view addSubview:seg]; 
[seg updateStyle]; 

最後の行は、醜いです。 encapsulationというオブジェクト指向の原則を維持するには、この詳細をクラス自体に移す必要があります。ビューがスーパービューに追加されたときを検出する機能があれば、サブクラス内でスタイルのハックをカプセル化することができます。いずれかの適切な

- (void)didAddSubview:(UIView *)subview 
- (void)willMoveToSuperview:(UIView *)newSuperview 
- (void)willMoveToWindow:(UIWindow *)newWindow 

答えて

9

オーバーライド?

+0

私は 'willMoveToSuperview'を使って終わりました。その関数の中で、私は '' self performSelector:@selector(updateStyle)withObject:nil afterDelay:0]; 'を実行しました。それを直ちに呼び出すと、分割されたコントロールのスタイルを変更できませんでした。 – Pwner

+0

代わりに ' - (void)didMoveToSuperview'を使用していても? (つまり、育児が終わったら、その前にメモしてください) – verec

0

UISegmentedControlの選択状態は、スタイルを設定するのが難しくありません。

setBackgroundImage:forState:barMetrics:メソッドを使用し、UIControlStateSelectedを名前付きパラメータforState:の引数として使用します。

UIKitコントロールのサブビューにアクセスしている場所はすべて、悪いものです。内部実装の詳細に頼るべきではありません。

+0

UIImageではなくUIColorに設定するにはどうすればいいですか? – Pwner

関連する問題