Подпредставления и типы NSView

У меня есть пара пользовательских подклассов NSBox, которые называются OuterBox и InnerBox. Я настроил свое представление в XIB и расположил иерархию следующим образом:

OuterBox : NSBox
    NSButton
    NSBox
    InnerBox : NSBox
    ...and some other views

Идея состоит в том, что когда NSButton нажимается, в методе IBAction я хочу получить супервизор кнопки, а затем, исходя из этого, получить InnerBox, который находится в том же OuterBox, что и кнопка.

Для этого я перебираю подпредставления OuterBox и проверяю их тип:

for (NSObject *subview in [outerBox subviews]) {
    // this never evaluates to true...
    if ([subview isKindOfClass:[InnerBox class]]) {
        // ...
    }
}

Проблема в том, что мой оператор if никогда не срабатывает. subview отображается в отладчике как NSView. Согласно документации, isKindOfClass:

возвращает YES, если получатель является экземпляром aClass или экземпляром любого класса, наследуемого от aClass, иначе NO.

Я понимаю, почему он возвращает NO: потому что InnerBox является типом NSView, но не наоборот. Но я не знаю, почему subview является UIView, когда это должен быть InnerBox.

Я импортировал InnerBox.h и убедился, что InnerBox действительно является InnerBox в XIB. Я не знаю, что может привести к изменению его типа или неправильному сообщению...


person alexantd    schedule 05.10.2010    source источник


Ответы (1)


Насколько я могу судить, isKindOfClass: должен возвращать YES при встрече с вашим InnerBox. Возможно, представления не вложены так, как вы предполагали. Две вещи, которые нужно проверить:

  1. Является ли супервью NSButton действительно OuterBox? (Вы можете NSLog контролировать отправителя в методе действия вашей кнопки.)
  2. Действительно ли InnerBox является частью OuterBox? (Возможно, установите IBOutlet для InnerBox и NSLog для его супервизора.)
person James Huddleston    schedule 05.10.2010
comment
Вот и все... либо у NSButton есть дополнительный супервизор, либо я пропускал один из его подвидов... Теперь, как вернуть эти пряди волос себе на голову. Клей, может... - person alexantd; 05.10.2010
comment
Да, NSBox — это особый случай. - person snuk182; 16.04.2018