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