NSView子视图和类型

时间:2010-10-05 01:11:47

标签: objective-c nsview xib nsobject

我有一些名为OuterBox和InnerBox的自定义NSBox子类。我在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是一个UIView,它应该是一个InnerBox。

我已经导入了InnerBox.h,并确保InnerBox确实是XIB中的InnerBox。我不知道是什么原因导致它的类型被改变,或报告错误......

1 个答案:

答案 0 :(得分:0)

据我所知,isKindOfClass:遇到你的YES时应该InnerBox。也许这些观点不是按照你的意图嵌套的。要检查两件事:

  1. NSButton的超级视图吗? OuterBox? (您可以在按钮的操作方法中NSLog发件人的超级视图。)
  2. InnerBox真的是一个子视图 OuterBox? (也许可以在其IBOutletInnerBox的超级视图中设置NSLog。)