UIView如何在添加到超级视图时获得回调?

时间:2013-07-22 19:29:16

标签: iphone ios cocoa-touch uiview uisegmentedcontrol

问题

我已经分组UIView。将此子类的对象添加到其superview后,它需要自动运行一些代码。如何挂钩此事件以运行我的代码?

为什么我需要它

所选的UISegmentedControl分段的背景众所周知难以设计。我能找到的最佳解决方案是做这个黑客攻击:

#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

需要在两个地方调用此updateStyle函数。显然,第一个是用户点击不同的段时。我可以通过覆盖SegmentedControlStyled的{​​{1}}函数并挂钩addTarget事件来自主执行此操作。在将UIControlEventValueChanged添加到其超级视图后,需要调用的第二个地方updateStyle。您可能会问,“为什么要在之后调用它而不是SegmentedControlStyled?”。好吧,从我的观察来看,在它被附加到视图之前调用它是没有效果的。因此,需要像这样编写代码:

init

最后一行是丑陋的,因为使用我的子类的同事必须理解为什么视图被破坏并且必须知道何时调用SegmentedControlStyled* seg = [[SegmentedControlStyled alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", nil]]; [self.view addSubview:seg]; [seg updateStyle]; 。为了坚持encapsulation的面向对象原则,这个细节应该移到课堂本身。如果我能够检测何时将视图添加到其superview中,我将能够将样式hack封装在我的子类中。

2 个答案:

答案 0 :(得分:10)

覆盖

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

酌情?

答案 1 :(得分:0)

UISegmentedControl的选定状态不难定型。

您使用方法setBackgroundImage:forState:barMetrics:并使用UIControlStateSelected作为命名参数forState:的参数。

您访问UIKit控件子视图的任何内容都是件坏事。您不应该依赖内部实施细节。