Пользовательский источник данных с NSComboBox ничего не отображает - PullRequest
2 голосов
/ 23 апреля 2011

Привет У меня есть следующая проблема при попытке установить источник данных в NSComboBox.

Это мой пользовательский класс источника данных:

@interface CComboDatasource : NSObject <NSComboBoxDataSource> {
@private
    NSMutableArray* values;
}
@property (nonatomic,retain) NSMutableArray* values;
-(int)itemCount;

@end


@implementation CComboDatasource
@synthesize values;

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
        values=[[NSMutableArray alloc] init];

        [values addObject:@"A"];
        [values addObject:@"B"];
        [values addObject:@"C"];
    }

    return self;
}


- (NSInteger)numberOfItemsInComboBox:(NSComboBox *)aComboBox
{
    return [values count];
}

- (id)comboBox:(NSComboBox *)aComboBox objectValueForItemAtIndex:(NSInteger)index
{
    return [values objectAtIndex:index];
}

- (void)dealloc
{
    [values release];
    [super dealloc];
}

@end

Позже в другом файле я связываю свой IBOutlet с моим NSComboBox объектом (c_box) и устанавливаю источник данных (CComboDatasource* data_source).

 [c_box setUsesDataSource:TRUE];
 [c_box setDataSource:data_source];
 [c_box setEditable:NO];

После предыдущих действий в поле со списком ничего не отображается, что я делаю не так?

Ответы [ 3 ]

1 голос
/ 23 апреля 2011

То, что у тебя есть, выглядит в основном правильно для меня.Я могу подумать о нескольких вещах, которые вы можете попробовать:

1) Попробуйте временно заменить «return [values ​​count]» на «return 5» и заменить «return [values ​​objectAtIndex: index]» на «return @»arbitraryString "".Если в поле со списком появляется «произвольная строка», вы будете знать, что проблема в массиве «значений».

2) Попробуйте инициализировать массив «значений» следующим образом:

values = [NSMutableArray array];

(Это удобный метод, предлагаемый в NSArray.)

Если вы придерживаетесь метода alloc-init, вы должны создать отдельный временный массив таким образом, присвоить ему «значения», а затем освободить его.В противном случае, поскольку вы присваиваете «значения» с помощью «retain», вы сохраняете его дважды.

3) Попробуйте добавить эту строку в конце ваших вызовов c_box:

[c_box reloadData];

И каждый раз, когда вы меняете массив источника данных, вызывайте его снова.

4) Я не понимаю, почему отделение класса источника данных от класса, управляющего списком, должно быть проблемой, но если это все еще не такработая, попробуйте сделать контроллер окна / представления, которому принадлежит выход комбинированного списка, класс, реализующий протокол NSComboBoxDataSource (методы numberOfItemsIn и objectValueFor), и либо поместите «значения» в этот класс контроллера, либо предоставьте этому классу доступ к «значениям».

Надеюсь, это поможет.

0 голосов
/ 01 марта 2014

У меня проблема с comboBox: objectValueForItemAtIndex: потому что у меня есть 10 полей со списком, каждое поле со списком я проверял: if (aComboBox == _myCombo)

8 поле со списком работает нормально, а 2 - нет. Я не знаю, что я делаю неправильно и почему другие работают. Я думал об этой проблеме около 2 недель. Я пытаюсь удалить и создать новый с различными шагами, но ничего не помогает.

Решение состоит в том, чтобы перезагрузить данные, прежде чем выбрать опцию в пробуждении от пера.

[_myCombo reloadData];
0 голосов
/ 23 апреля 2011

Хорошо, я нашел проблему, чтобы пользовательский класс источника данных работал, вам нужно

  1. Создайте объект NSObject и перетащите его в редактор
  2. Измените тип на ваш собственный класс источника данных
  3. Объявите ваш источник данных как IBOutlet CustomDatasourceClass * myclass
  4. Соединить объект с предыдущей розеткой
  5. Свяжите свой источник данных NScomboBox (в конструкторе IB) с объектом CustomDatasourceClass
...