2013-07-22 17 views
6

Sorun

UIView alt sınıfına sahibim. Bu alt sınıfın bir nesnesi süper görünümüne eklendikten sonra, bazı kodların bağımsız olarak çalıştırılması gerekir. Kodumu çalıştırmak için bu etkinliğe nasıl bağlanabilirim? Bir UIView süper görüşüne eklendiğinde nasıl bir geri dönüş yapabilir?

neden o

arka plan ait Need seçilen stile herkesin bildiği gibi zor olmuştur UISegmentedControl ait segmente. Bulabildiğim en iyi çözüm bu kesmek yapıyor:

#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 

Bu updateStyle fonksiyon iki yerde çağrılması gerekir. Açıkçası, bir kullanıcı bir kullanıcı farklı bir segmente dokunduğunda. Ben SegmentedControlStyled 's addTarget işlevini geçersiz kılarak ve UIControlEventValueChanged olayına bağlanarak bunu bağımsız olarak yapabilirim. çağrıldıktan sonra ikinci updateStyle çağrılması gereken bir süper görünümüne SegmentedControlStyled eklenir. “Neden sonra arayabilirsin ve init gibi bir yere gitmiyorsun?” Diye sorabilirsin. Eh, benim gözlemlerimden, onu hidayet görüşüne bağlı olmadan çağırmak hiçbir etkiye sahip değildir. Bu nedenle, kimse bu gibi onların kod yazmak gerekiyor: my alt sınıf kullanır meslektaş görünümü bozuldu anlamak zorundadır ve ne zaman updateStyle aramaya bilmek zorunda çünkü

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

son satırı, çirkin. Nesne yönelimli encapsulation prensibini desteklemek için, bu ayrıntı sınıfın kendisine taşınmalıdır. Bir görüntünün süper görüntüsüne eklendiğini algılayabilme yeteneğine sahip olsaydım, alt sınıfımdaki stil hack'ını kapsülleyebilirdim.

cevap

9

yüzdesel

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

uygun

biri?

+0

'willMoveToSuperview' kullanarak bitti. Bu işlevin içinde, [selfOnject: @selector (updateStyle) withObject: nil afterDelay: 0]; '. Hemen çağırmak, bölümlere ayrılmış kontrolü yeniden yapılandıramaz. – Pwner

+0

Bunun yerine '- (void) didMoveToSuperview' kullanıldığında bile? (yani, ebeveynlik bittikten sonra, not alınmadan önce) – verec

0

UISegmentedControl'un seçili durumu stil vermek zor değil.

setBackgroundImage:forState:barMetrics: yöntemini kullanırsınız ve forState: adlı parametrenin argümanını UIControlStateSelected kullanın.

UIKit denetimlerinin alt görünümlerine eriştiğiniz her şey kötü bir şeydir ™. İç uygulama ayrıntılarına güvenmemelisiniz.

+0

UIImage yerine bir UIColor'a nasıl ayarlayabilirim? – Pwner

İlgili konular