Пользовательский источник данных с 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];
Хорошо, я нашел проблему, для того, чтобы пользовательский класс источника данных работал, вам нужно
- Создайте объект NSObject и перетащите его в редактор
- Измените тип на ваш собственный класс источника данных
- Объявите ваш источник данных как IBOutlet CustomDatasourceClass* myclass
- Соедините Объект с предыдущей розеткой
- Свяжите свой источник данных NScomboBox (в дизайнере IB) с объектом CustomDatasourceClass