测试object是否为类UISegment

时间:2016-04-27 20:39:51

标签: ios objective-c uisegmentedcontrol

所以,我正在做一些丑陋的黑客修改UISegmentedControl中各个细分的外观。当我走下UISegmentedControl的子视图数组并打印每个直接子视图的类名时,我可以看到控件中的每个段都有UISegment个实例:

for (UIView *view in [[self segments] subviews])
{
    NSLog(@"%@", NSStringFromClass([view class]));
}

现在显然Xcode无法解决此课程,因此我无法使用熟悉的[view isKindOfClass:[UISegment class]]

我以为我只是错过了要包含的标题,但我也can't find any docs for it on Apple's developer reference site

那么,如果对象是UISegment的实例,我将如何测试?这个类究竟是什么 - 它的名称可以在运行时解析而不是在编译时解析?

修改

我想要实现的目标是明确指出特定段已启用或禁用。例如,当我禁用整个UISegmentedControl时,以下内容非常适合更新选定和未选定的段颜色/字体:

- (void)setIsEnabled:(BOOL)isEnabled
{
    [super setIsEnabled:isEnabled];

    // be careful and ensure you use the isEnabled getter because it takes isEnabledForConfiguration into account
    [[self segments] setUserInteractionEnabled:[self isEnabled]];

    [[self segments] setTintColor:[self interactionColor]];

    [[self segments] setTitleTextAttributes:[NSDictionary dictionaryWithObject:[self enabledTextColor]
                                                                        forKey:NSForegroundColorAttributeName]
                                   forState:UIControlStateNormal];
}

但是有时候只应该禁用一部分片段,我希望在视觉上明确这一点(-(void)setEnabled:forSegmentAtIndex:方法似乎没有任何明显的效果)。

所以我发现我可以修改这些UISegment子视图以实现视觉更新(令人讨厌的黑客,我知道未来仍然无法工作,我知道......)。

尝试防范未来的API更改,我已尽最大努力实现一种灵活的方式来按段索引获取对UISegment对象的引用。

首先,我在输入段索引处获取段的标题,然后一直向下遍历UISegmentedControl视图层次结构,直到找到响应text选择器并且其{{{{ 1}}值等于标题。该视图似乎总是text(这是另一个私人课程!),他的超级视图是UISegmentLabel我正在寻找的。所以我想出了:

UISegment

问题的真正原因在于- (UIView *)getSegmentAtIndex:(NSInteger)index { NSString *title = [[self segments] titleForSegmentAtIndex:index]; id segment = nil; if (nil != title && 0 < [[EFBGlobalUtil trimWhitespace:title] length]) { segment = [[EFBGlobalUtil viewWithCondition:^BOOL(UIView *view) { return [view respondsToSelector:@selector(text)] && [title isEqualToString:[view valueForKey:NSStringize(text)]]; } inView:[self segments]] /* this dude -> */superview]; } return segment; } 吸气剂我坚持到底。我想验证superview实际上是superview,但是解决方案也可以帮助我检查UISegment个对象(而不是UISegmentLabel选择器)。

作为参考,这里是text实用程序例程:

+(void)viewWithCondition:inView:

0 个答案:

没有答案