Пользовательский источник данных с NSComboBox ничего не отображает

Привет У меня есть следующая проблема, пытаясь установить источник данных в 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) Попробуйте временно заменить "return [values ​​count]" на "return 5" и заменить "return [values ​​objectAtIndex:index]" на "return @" произвольное_строку "". Если в поле со списком появляется "произвольная строка", вы будете знать, что проблема в массиве "значения".

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

values = [NSMutableArray array];

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

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

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

[c_box reloadData];

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

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

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

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

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

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

[_myCombo reloadData];

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

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