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? (也许为InnerBoxNSLog 其父视图设置一个IBOutlet。)

【讨论】:

就是这样......要么 NSButton 有一个额外的超级视图,要么我正在传递它的一个子视图......现在,如何让这些头发回到我的头上。胶水,也许…… 是的,NSBox is a special case。

以上是关于NSView 子视图和类型的主要内容,如果未能解决你的问题,请参考以下文章

添加为子视图的 NSView 不显示

添加子视图到 NSView 显示,但不能删除

NSView 子视图的 Alpha 值

将子视图添加到 NSView

NSView 的子视图的顺序是不是有保证?

将 xib 视图初始化为另一个 NSView 的子视图