問題
私は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つの場所で呼び出す必要があります。明らかに、最初は、ユーザーが別のセグメントをタップするたびに発生します。 SegmentedControlStyled
のaddTarget
関数をオーバーライドして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
の
私は 'willMoveToSuperview'を使って終わりました。その関数の中で、私は '' self performSelector:@selector(updateStyle)withObject:nil afterDelay:0]; 'を実行しました。それを直ちに呼び出すと、分割されたコントロールのスタイルを変更できませんでした。 – Pwner
代わりに ' - (void)didMoveToSuperview'を使用していても? (つまり、育児が終わったら、その前にメモしてください) – verec