如何判断子类是否从超类中添加?

问题描述:

我正在编写UIScrollView的子类,作为我正在做的一部分,我需要第二个scrollView来包含所有的子视图。如何判断子类是否从超类中添加?

原因是第二个scrollview会有一个'实际'的内容大小,而子类的scrollview会有更大的内容大小,而在-scrollViewDidScroll中:我根据实际情况更改第二个scrollView的内容偏移量内容偏移。

当用户向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中)是否被超类(或者甚至是自己)添加?

+0

对不起,我不知道有任何其他检查方式,但我分担你的焦虑。你可以实现一个不同的方法(例如'addUserSubview:')来添加子视图,在你的代码中使用,而超级粘贴到'addSubview:'? – pbasdf 2014-09-14 14:40:11

+0

我避免这样做的主要原因是因为我希望我的子类能够像scrollview一样使用,所以一个认为它只是一个UIScrollView的类将正确使用它。 – Jsdodgers 2014-09-14 22:43:56

你可以创建一个自定义的uiview作为包装没有任何实现。
WrapperView wrapperview = [WrapperView new]; wrapperview.view = theRealViewToAdd;
然后你可以用[object isKindOfClass:[WrapperView class]]来测试你的自定义视图。

+0

我不太确定你的解决方案试图做什么。我想能够确定什么类叫做-addSubview(或者更具体地说,我想知道它是否是'super')。 – Jsdodgers 2014-09-13 22:28:11

+0

对不起,然后我missunderstood你的问题。有没有可能为你的根问题提供一个替代解决方案,所以你不需要知道超级? – donmarkusi 2014-09-14 10:29:51

+0

嗯,我主要试图确定哪些视图被添加了滚动指标,所以我想如果有一种可靠的方法来区分这些视图与其他视图,那也可以。 – Jsdodgers 2014-09-14 22:45:09