2013-07-22 10 views
6

Problema

Ho sottoclasse un UIView. Dopo che un oggetto di questa sottoclasse viene aggiunto alla sua superview, ha bisogno di eseguire autonomamente del codice. Come posso collegarmi a questo evento per eseguire il mio codice?Come può un UIView ricevere una richiamata quando viene aggiunta alla sua superview?

Perché ne ho bisogno

Lo sfondo della selezionato segmentato di un UISegmentedControl è stato notoriamente difficili da stile. La soluzione migliore che ho trovato sta facendo questo hack:

#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 

Questa updateStyle funzione deve essere chiamata in due punti. Ovviamente, il primo è quando l'utente tocca un segmento diverso. Posso farlo autonomamente sovrascrivendo la mia funzione addTargetSegmentedControlStyled e agganciandola all'evento UIControlEventValueChanged. Il secondo posto updateStyle deve essere chiamato è dopo a SegmentedControlStyled viene aggiunto alla sua superview. Potresti chiedere, "perché lo chiami dopo e non da qualche parte come init?". Bene, dalle mie osservazioni, chiamandolo prima che sia collegato alla vista, la ricerca non ha alcun effetto. Pertanto, si ha la necessità di scrivere il codice come questo:

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

L'ultima riga è brutto, perché il collega che usa il mio sottoclasse deve capire il motivo per cui la vista è rotto e deve sapere quando chiamare updateStyle. Per mantenere il principio di Orientamento agli oggetti di encapsulation, questo dettaglio dovrebbe essere spostato nella classe stessa. Se avessi la possibilità di rilevare quando una vista è stata aggiunta alla sua superview, sarei in grado di incapsulare l'hack di stile nella mia sottoclasse.

risposta

9

Override uno dei

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

a seconda dei casi?

+0

Ho finito per usare 'willMoveToSuperview'. All'interno di quella funzione, ho fatto '[self performSelector: @selector (updateStyle) withObject: nil afterDelay: 0];'. Chiamandolo immediatamente non è possibile restringere il controllo segmentato. – Pwner

+0

Anche se si utilizza '- (void) didMoveToSuperview'? (cioè una volta terminata la genitorialità, nota prima che lo sia) – verec

0

Lo stato selezionato di UISegmentedControl non è difficile da modificare.

Si utilizza il metodo setBackgroundImage:forState:barMetrics: e utilizzare UIControlStateSelected come argomento per il parametro denominato forState:.

Tutto ciò in cui si accede alle sottoview dei controlli UIKit è una cosa brutta ™. Non dovresti fare affidamento sui dettagli di implementazione interna.

+0

Come faccio a impostarlo su un UIColor anziché su UIImage? – Pwner

Problemi correlati