【问题标题】:Iterate everything except UIContainerView迭代除 UIContainerView 之外的所有内容
【发布时间】:2017-04-10 02:27:36
【问题描述】:

我有一个自定义类(我从 SO 获得)来迭代 UIView 的所有子类。我没有得到的是我无法添加代码来豁免UIContainerView

代码(在 UIView+Recursion.m 中):

- (NSMutableArray*)allSubViews
{
    NSMutableArray *arr= [[NSMutableArray alloc] init];
    [arr addObject:self];
    for (UIView *subview in self.subviews)
    {
        [arr addObjectsFromArray:(NSArray*)[subview allSubViews]];
    }
    return arr;
}

所以我想在for循环中添加,如果是UIContainerView,那么就不要添加到数组中。我尝试了什么:

- (NSMutableArray*)allSubViews
{
    NSMutableArray *arr= [[NSMutableArray alloc] init];
    [arr addObject:self];
    for (UIView *subview in self.subviews)
    {
        if (![subview isKindOfClass:[UIContainerView class]]) <-- error use of undeclared identifier
        [arr addObjectsFromArray:(NSArray*)[subview allSubViews]];
    }
    return arr;
}

完整的错误信息:

使用未声明的标识符“UIContainerView”

类别类似乎无法识别UIContainerView

【问题讨论】:

  • 什么是UIContainerView?这不是公开课。
  • 请在您的 Q 中添加原始错误消息。哪个标识符未声明?

标签: ios objective-c uicontainerview


【解决方案1】:

您似乎希望检查私有类,这就是您的代码无法编译的原因。如果这是你真正需要做的,那么你可以使用NSClassFromString

- (NSMutableArray *)allSubViews
{
    Class cvclass = NSClassFromString(@"UIContainerView");
    NSMutableArray *arr= [[NSMutableArray alloc] init];
    [arr addObject:self];
    for (UIView *subview in self.subviews)
    {
        if (![subview isKindOfClass:cvclass]) {
            [arr addObjectsFromArray:[subview allSubViews]];
        }
    }

    return arr;
}

【讨论】:

  • 感谢这项工作。我想知道为什么 Apple 将 UIContainerView 设为私有。而且我想知道他们是否会拒绝我的应用程序使用它?
  • 它是私有的,因为它仅供内部使用。是的,您的应用程序被拒绝的可能性很小。只有一种方法可以确定。
  • 我有一个解决方法 - 只使用标签,但我不喜欢标签,它会产生如此多的依赖。无论如何,我将使用它 (NSClassFromString) 并希望 Apple 不会拒绝它。让我们向史蒂夫·乔布斯祈祷。
猜你喜欢
  • 2015-12-25
  • 1970-01-01
  • 2016-01-11
  • 2015-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
相关资源
最近更新 更多