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 oarka 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.
'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
Bunun yerine '- (void) didMoveToSuperview' kullanıldığında bile? (yani, ebeveynlik bittikten sonra, not alınmadan önce) – verec