«Объекты» могут не отвечать на предупреждения «функций» - PullRequest
0 голосов
/ 11 января 2011

за последние пару недель я наконец вошел в Obj-C с обычного C и запустил свое первое приложение. Я смотрел учебные пособия и читал книгу вместе со многими веб-страницами, но я знаю, что только начал. Во всяком случае, большую часть ночи и этим утром я пытался заставить этот код работать, и теперь, когда он скомпилируется, у меня есть несколько предупреждений. Я искал и нашел похожие проблемы с решениями, но все еще не играли в кости. То, что я пытаюсь сделать, это поместить массив, сделанный из txt-документа, во всплывающий список в поле со списком.

AwesomeBoxList.h:

    #import <Cocoa/Cocoa.h>
@interface AwesomeBoxList : NSObject 
{
  IBOutlet NSComboBox *ComboBoz;
}
-(NSArray *) getStringzFromTxtz;
- (void) awesomeBoxList;
@end

AwesomeBoxList.m:

#import "AwesomeBoxList.h"

@implementation AwesomeBoxList

-(NSArray *)getStringzFromTxtz 
{
...
return combind;
}

- (void) awesomeBoxList
{
 [ComboBoz setUsesDataSource:YES];


 [ComboBoz setDataSource:

[ComboBoz getStringzFromTxtz]: //'NSComboBox' may not respond to 'getStringzFromTxtz'

[ComboBoz comboBox:(NSComboBox *)ComboBoz objectValueForItemAtIndex: 

 [ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]]];


        /*'NSComboBox' may not respond to '-numberOfItemsInComboBox:'
   'NSComboBox' may not respond to '-comboBox:objectValueForItemAtIndex:'
   'NSComboBox' may not respond to '-setDataSource:'
  */
 }

@end

Итак, со всеми этими ошибками и моим все еще поверхностным знанием Obj-C я, должно быть, совершил какую-то ошибку n00b.

Спасибо за помощь.

Ответы [ 3 ]

1 голос
/ 11 января 2011

Кажется, что здесь, как правило, много путаницы, в основном проявляющейся в вашем последнем (4) строка (и) кода. Вам известно, что символ ':' используется для передачи аргументов в методы, а не для завершения строки? Вы, по сути, маргаритка, соединяющая эти последние 4 строки вместе, что не имеет смысла. Что касается конкретных предупреждений, getStringzFromTxtz - это метод, который вы определили в AwesomeBoxList, а не метод NSComboBox. numberOfItemsInComboBox: и comboBox: objectValueForItemAtIndex: являются NSComboBoxDataSource Protocol методами, предназначенными для реализации вашим классом от имени NSComboBox, а не NSComboBox. Я бы порекомендовал немного почитать делегатов и протоколы.

Для уточнения: Чтобы ваш класс AwesomeBoxList использовал NSComboBox, он должен предоставить информацию в поле со списком, который должен знать поле со списком. В Apple Universe подобные ситуации обычно обрабатываются с помощью Шаблон проектирования делегатов . В частности, поле со списком должно знать , сколько элементов оно будет отображать , а также представление объекта для каждого из показанных элементов . Поле со списком объявляет интерфейс для этого в NSComboBoxDataSource Protocol . Предоставляя эту информацию, вы действуете как источник данных для поля со списком. Вы можете указать в поле со списком, что он должен отнести ваш класс к своим данным, установив себя в качестве его свойства dataSource в Интерфейсном Разработчике или вызвав

[ComboBoz setDataSource:self];

откуда-то в реализации вашего AwesomeBoxList. Это гарантирует, что поле со списком вызывает методы в вашем классе, чтобы заполнить себя информацией. Есть два метода, которые конкретно должен реализовывать ваш класс AwesomeBoxList и которые будут вызываться комбинированным окном:

- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index {
    switch (index) {
        // Return some object that is represented by index in the combo box
    }
}

- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox {
    // return theNumberOfItemsInYourComboBox;
}

Обеспечение осмысленной реализации - это все, что вам нужно сделать, чтобы заполнить поле со списком данными. Я не знаю специфики того, что вы хотите здесь, но это шаблон, которому вы хотите следовать. Надеюсь, это поможет немного больше.

0 голосов
/ 11 января 2011

Эти методы не существуют. См. Документацию NSComboBox для получения дополнительной информации.

Вместо:

[ComboBoz 
 comboBox:(NSComboBox *)ComboBoz 
 objectValueForItemAtIndex:[ComboBoz numberOfItemsInComboBox:(NSComboBox *)ComboBoz]];

Попробуйте:

[[comboBox objectValues] objectAtIndex:[comboBox numberOfItems] - 1];

Также обратите внимание, что соглашение о платформе должно использовать строчную букву в начале ивара.

0 голосов
/ 11 января 2011

Хорошо, getStringzFromTxtz не будет работать при отправке в экземпляр NSComboBox, поскольку этот метод объявлен и определен в вашем классе AwesomeBoxList.Этот метод не будет найден во время выполнения.

Кроме того, я думаю, что вам, возможно, придется разобраться с делегатами и источниками данных - другие методы являются частью протокола NSComboBoxDataSource.Посмотрите руководство по программированию Combo Box в документах для примеров.

...