2

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:

レシーバーがaClassYESのインスタンスであるか、aClassから継承するクラスのインスタンスである場合は、それ以外の場合はを返しますNO

NOInnerBoxはNSViewの一種ですが、その逆ではないため、なぜ返されるのか理解しています。subviewしかし、UIViewがInnerBoxである必要があるのになぜなのかわかりません。

InnerBox.hをインポートし、InnerBoxが実際にXIBのInnerBoxであることを確認しました。タイプが変更されたり、誤って報告されたりする原因がわかりません...

4

1 に答える 1

0

私が知る限り、あなたのに遭遇したときにisKindOfClass:戻る必要があります。おそらく、ビューは意図したとおりにネストされていません。チェックする2つのこと:YESInnerBox

  1. のスーパービューはNSButton本当にOuterBoxですか?(NSLogボタンのアクションメソッドで送信者を監視できます。)
  2. 本当にInnerBoxのサブビュー OuterBoxですか?(おそらくIBOutletInnerBoxNSLogそのスーパービューを設定します。)
于 2010-10-05T01:44:07.673 に答える