NSView подпредставления и типы - PullRequest
2 голосов
/ 05 октября 2010

У меня есть пара пользовательских подклассов 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. Я не знаю, что может быть причиной изменения его типа или неправильного сообщения ...

1 Ответ

0 голосов
/ 05 октября 2010

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

  1. Действительно ли супервизор NSButton OuterBox? (Вы можете NSLog супервизор отправителя в методе действия вашей кнопки.)
  2. Является ли InnerBox действительно подвидом OuterBox? (Возможно, установите IBOutlet для InnerBox и NSLog его суперпредставления.)
...