如何判断是不是从超类添加了子视图?

Posted

技术标签:

【中文标题】如何判断是不是从超类添加了子视图?【英文标题】:How can I tell if a subview was added from the superclass?如何判断是否从超类添加了子视图? 【发布时间】:2014-09-13 19:16:27 【问题描述】:

我现在正在编写 UIScrollView 的子类,作为我正在做的一部分,我需要第二个 scrollView 来包含所有子视图。

这样做的原因是第二个滚动视图会有一个“实际”的内容大小,而子类滚动视图会有一个更大的内容大小,并且在 -scrollViewDidScroll: 我根据实际内容更改了第二个滚动视图的内容偏移量偏移量。

当用户在scrollView中添加一个子视图时,它实际上会将它添加到第二个scrollView中。

我最初遇到的一个问题是 UIScrollView 类向 scrollView(滚动指示器)添加了两个视图,我想保留它们。

我发现的一种解决方法which is the top answer here(经过修改)适用于我想要的,它是在 -addSubview 方法中获取发件人类的名称,如下所示:

NSString *sourceString = [[NSThread callStackSymbols] objectAtIndex:1];
// Example: 1   UIKit                               0x00540c89 -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
NSCharacterSet *separatorSet = [NSCharacterSet characterSetWithCharactersInString:@" -[]+?.,"];
NSMutableArray *array = [NSMutableArray arrayWithArray:[sourceString  componentsSeparatedByCharactersInSet:separatorSet]];
[array removeObject:@""];
if (![[array objectAtIndex:3] isEqualToString:@"<redacted>"]) 
    //My code here

else 
    [super addSubview:view];

虽然这个代码块有效并且我得到了我想要的结果,但它看起来有点笨拙,并且需要检查调用类是否为“”,我认为这意味着它不希望我看到它姓名。我担心如果将来发生任何更改或其他某些类的值为“”

,使用此方法会导致问题

基本上我的问题是(也是 TL;DR):是否有更好的方法(或更可靠)来检查正在添加的视图(在 -addSubview 中)是否由超类(甚至是自己)添加?

【问题讨论】:

对不起,我不知道有什么其他的方法可以检查,尽管我和你一样焦虑。你能否实现一个不同的方法(例如addUserSubview:)来添加子视图,在你的代码中使用,而超级坚持addSubview: 我避免这样做的主要原因是因为我希望我的子类能够完全像滚动视图一样使用,以便认为它只是 UIScrollView 的类可以正确使用它。 【参考方案1】:

您可以创建自定义 uiview 作为包装器,无需任何实现。 WrapperView wrapperview = [WrapperView new]; wrapperview.view = theRealViewToAdd; 然后您可以使用 [object isKindOfClass:[WrapperView class]] 测试您的自定义视图。

【讨论】:

我不太确定您的解决方案要做什么。我希望能够确定哪个类称为 -addSubview(或者更具体地说,我想知道是不是 super 调用它)。 对不起,我误解了你的问题。是否有针对您的根本问题的替代解决方案,因此您不需要了解超级? 好吧,我主要是想确定要添加的哪些视图是滚动指示器,所以我想如果有一种可靠的方法可以将这些视图与其他视图区分开来,那也可以。 几个想法;抱歉,如果您在这些方面领先于我: 1) 你知道super什么时候添加滚动条吗?只是在初始化期间吗?还是可以随时?如果是前者,您可以在调用 super init 之前覆盖 init 并设置一个标志,并在之后将其清除(同样适用于 showsHorizo​​ntalScrollIndicator 等)。在您的 addSubview 中测试标志。或者2)你的子类中有两个scrollView子视图,并且有所有调用[scrollView1方法:]而不是[超级方法:]的scrollView方法的简单实现吗?而 addSubview 会做 [scrollView2 addSubview].

以上是关于如何判断是不是从超类添加了子视图?的主要内容,如果未能解决你的问题,请参考以下文章

如何从超类中检测对象

OWL:如何从超类继承两个类之间的属性关系?

从超类对象初始化子类实例

Python子类方法从超类方法继承装饰器

如何键入提示 Python 函数返回从超类派生的任何类的实例?

ruby 如何从超类初始化关键字参数(对依赖注入很有用)