NSView 子视图和类型
Posted
技术标签:
【中文标题】NSView 子视图和类型【英文标题】:NSView subviews and types 【发布时间】:2010-10-05 01:11:46 【问题描述】:我有几个自定义的 NSBox 子类,称为 OuterBox 和 InnerBox。我已经在 XIB 中设置了我的视图,并像这样安排了层次结构:
OuterBox : NSBox
NSButton
NSBox
InnerBox : NSBox
...and some other views
这个想法是,当 NSButton 被按下时,在 IBAction 方法中,我想获取按钮的超级视图,然后从中获取与按钮在同一个 OuterBox 中的 InnerBox。
为此,我遍历 OuterBox 的子视图并检查它们的类型:
for (NSObject *subview in [outerBox subviews])
// this never evaluates to true...
if ([subview isKindOfClass:[InnerBox class]])
// ...
问题是我的if
语句永远不会成功。 subview
在调试器中显示为 NSView。根据文档,isKindOfClass:
如果接收者是 aClass 的实例或继承自 aClass 的任何类的实例,则返回
YES
,否则返回NO
。
我理解它为什么返回 NO
: 因为 InnerBox 是 NSView 的一种类型,反之则不然。但我不知道为什么 subview
应该是一个 InnerBox 却是一个 UIView。
我已导入 InnerBox.h 并确保 InnerBox 确实是 XIB 中的 InnerBox。我不知道是什么导致它的类型发生变化,或者被错误地报告......
【问题讨论】:
【参考方案1】:据我所知,isKindOfClass:
在遇到您的InnerBox
时应该返回YES
。也许视图没有按照您的意图嵌套。要检查两件事:
-
真的是
NSButton
的superview吗
OuterBox
? (您可以在按钮的操作方法中 NSLog
发送者的超级视图。)
InnerBox
真的是
OuterBox
? (也许为InnerBox
和NSLog
其父视图设置一个IBOutlet
。)
【讨论】:
就是这样......要么 NSButton 有一个额外的超级视图,要么我正在传递它的一个子视图......现在,如何让这些头发回到我的头上。胶水,也许…… 是的,NSBox is a special case。以上是关于NSView 子视图和类型的主要内容,如果未能解决你的问题,请参考以下文章