2013-07-22 15 views
6

Problem

Mam podklasę UIView. Po dodaniu obiektu do tej podklasy do jego superview, musi on samodzielnie uruchomić jakiś kod. Jak mogę podłączyć się do tego zdarzenia, aby uruchomić mój kod?W jaki sposób UIView może uzyskać wywołanie zwrotne, gdy zostanie dodane do jego widoku?

Dlaczego I Need To

tle wybrany segmentowe z UISegmentedControl była notorycznie trudne do stylu. Najlepszym rozwiązaniem może znajdę robi to 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 

Ten updateStyle funkcja musi być wywołana w dwóch miejscach. Oczywiście pierwsze jest, gdy użytkownik dotknie innego segmentu. Mogę to zrobić autonomicznie, zastępując funkcję SegmentedControlStyled za pomocą i zahaczając o zdarzenie UIControlEventValueChanged. Drugie miejsce updateStyle musi być wywołane pod numerem po zostanie dodany do jego super-widoku SegmentedControlStyled. Możesz zapytać: "dlaczego nazywasz to po, a nie gdzieś takim jak init?". Cóż, z moich obserwacji, wzywanie go przedtem jest przywiązane do widoku hiearchatu, nie ma żadnego skutku. Dlatego trzeba napisać swój kod tak:

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

Ostatni wiersz jest brzydki, ponieważ współpracownik, który używa mojego podklasy musi zrozumieć, dlaczego widok jest uszkodzony i musi wiedzieć, kiedy należy zadzwonić updateStyle. Aby zachować zasadę Object Objected z zakresu encapsulation, ten szczegół powinien zostać przeniesiony do samej klasy. Gdybym był w stanie wykryć, kiedy widok został dodany do jego podglądu, byłbym w stanie hermetyzować hakowanie stylu w obrębie mojej podklasy.

Odpowiedz

9

nadpisanie jednego z

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

odpowiednio?

+0

Skończyło się na użyciu 'willMoveToSuperview'. Wewnątrz tej funkcji zrobiłem '[self performSelector: @selector (updateStyle) withObject: nil afterDelay: 0];'. Wywołanie go natychmiast nie może zmienić konfiguracji podzielonej na segmenty. – Pwner

+0

Nawet przy użyciu '- (void) didMoveToSuperview' zamiast tego? (po zakończeniu rodzicielstwa, zanotuj, zanim to nastąpi). – verec

0

Wybrany stan UISegmentedControl nie jest trudny do stylizacji.

Korzystasz z metody setBackgroundImage:forState:barMetrics: i używasz UIControlStateSelected jako argumentu dla nazwanego parametru forState:.

Wszystko, co ma dostęp do subskrybentów kontrolek UIKit, to coś złego ™. Nie powinieneś polegać na wewnętrznych szczegółach implementacji.

+0

Jak ustawić go na kolor UIColor zamiast UII? – Pwner

Powiązane problemy