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 addTarget
SegmentedControlStyled
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.
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
Anche se si utilizza '- (void) didMoveToSuperview'? (cioè una volta terminata la genitorialità, nota prima che lo sia) – verec