【问题标题】:NSView subviews and typesNSView 子视图和类型
【发布时间】: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。我不知道是什么导致它的类型发生变化,或者被错误地报告......

【问题讨论】:

    标签: objective-c nsview xib nsobject


    【解决方案1】:

    据我所知,isKindOfClass: 在遇到您的InnerBox 时应该返回YES。也许视图没有按照您的意图嵌套。要检查两件事:

    1. 真的是NSButton的superview吗 OuterBox? (您可以在按钮的操作方法中 NSLog 发送者的超级视图。)
    2. InnerBox 真的是 OuterBox? (也许为InnerBoxNSLog 其父视图设置一个IBOutlet。)

    【讨论】:

    • 就是这样......要么 NSButton 有一个额外的超级视图,要么我正在传递它的一个子视图......现在,如何让这些头发回到我的头上。胶水,也许……
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 1970-01-01
    相关资源
    最近更新 更多