2015-01-17 5 views
0

Я получаю какое-то странное поведение, я устанавливаю ярлык в построителе интерфейса, а затем подключаю ярлык к файлу в качестве реферирующего выхода.Cocoa Outlets, действующий wierd, не распознает селектор

@property (weak) IBOutlet NSTextField *TitleLabel; 

Когда я получить доступ к этой метки в файле (cell.TitleLabel.stringValue = название) и запустить приложение, оно не признает it.I эту:

-[NSApplication TitleLabel]: unrecognized selector sent to instance 0x608000101680 

Странная вещь заключается в том, что он не всегда это делает, иногда он работает и отображается правильно, а иногда - нет.

Я только начал общаться с IB, поэтому я, вероятно, что-то пропустил. Любая помощь?

+1

Это сообщение ** всего ** сообщение об ошибке? Кстати, переменные экземпляра условного обозначения начинаются с строчной буквы. – zaph

+0

Да, это сообщение об ошибке, оно ломается в строке, где я пытаюсь получить доступ к ярлыку. – BigRed

ответ

1

Является ли недвижимость действительно на вашем NSApplication подклассе? или это на вас делегировать класс приложения? Это не невозможно для того, чтобы быть на объекте приложения, но это был бы довольно необычный (и, возможно, плохой) шаблон.

Короче говоря, я подозреваю, что вы, вероятно, подключаете его к неправильному объекту.

EDIT: Ah. Понимаю. Вы пытаетесь получить доступ к вещам через массив topLevelObjects, но на практике вы не можете рассчитывать на порядок topLevelObjects. Что вам нужно, чтобы полагаться на выходы owner, заселяемые, но вы передаете nil для owner. topLevelObjects существует только для того, чтобы предоставить вызывающему абоненту «право собственности» (в смысле подсчета ссылок) объектов верхнего уровня в xib для целей управления памятью, это не значит, что оно «используется» прямо так, как вы здесь. (Справедливости ради, я могу представить себе ситуации, в которых вам, возможно, понадобится исследовать этот массив, но это вряд ли повысится до этого уровня.)

Канонический способ сделать это - использовать в качестве владельца подкласс NSViewController. В Xcode, если вы добавите подпроект NSViewController в свой проект, он даст вам возможность создать файл xib в то же время, что и все, что подключено. Затем вы просто инициализируете подкласс NSViewController во время выполнения, а свойство outlet view этого класса будет заполнено корневым представлением. Вы можете, очевидно, добавить больше торговых точек и подключить все, что захотите.

This post, похоже, охватывает основы, если вы ищете более подробную информацию. Документы Apple о файлах xib и о том, как они работают, - here.

+0

Нет в моем подклассе NSApplication. Я создал новое представление xib. Затем я добавляю пользовательский класс в NSView. К файлу, к которому я подключаю, относится NSView с пользовательским классом. Heres фото: http://postimg.org/image/ofrjmtykb/ – BigRed

0

Проблема заключалась в том, что вид иногда присваивается NSApplication. Я не уверен, если так, что я инициирую мнение является распространенным способом сделать это, но проблема была в этом блоке кода:

NSArray * views; 
[[NSBundle mainBundle] loadNibNamed:@"CollapseClickViewController" owner:nil topLevelObjects:&views]; 
CollapseClickCell * cell = [[CollapseClickCell alloc] initWithFrame:CGRectMake(0,0,320,50)]; 
cell = [views objectAtIndex:0]; 

проблема заключалась в том, что [views objectAtIndex:0] иногда возвращают NSApplication. Чтобы исправить это, я только что проверил класс против себя и вернулся, что объект с помощью:

-(CollapseClickCell*)assignCell:(CollapseClickCell*)cell withArray:(NSArray*)array{ 
for (int i = 0; i< [array count]; i++) { 
    if ([[array objectAtIndex:i] class] == [CollapseClickCell class]) { 
     return [array objectAtIndex:i]; 
    } 
} 
return nil; 

}

я затем присвоить, что к объекту: cell = [cell assignCell:cell withArray:views];

Это не может быть обычным способом но это работает. Если есть лучшая техника или более общий подход, пожалуйста, просветите меня!:)

+0

Да, это неправильный способ сделать это. Вероятно, это было бы лучше представлено как редактирование вопроса. Я отредактировал свой ответ, чтобы немного разобраться. – ipmcc

Смежные вопросы