UIPickerView появляется, но не показывает данные - PullRequest
2 голосов
/ 04 ноября 2011

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

Мое приложение сканирует теги QRCode и сохраняет их в изменяемый массив. Мне нужно создать способ, чтобы пользователь мог удалить некоторые объекты тегов из массива, поэтому я использую UIPickerView для отображения списка номеров тегов, из которых можно выбрать теги для удаления.

Вот что у меня есть:

в файле .h

@interface ViewController : UIViewController
    UIPickerView *tagPickerView;
    NSMutableArray *tagPickerData;

@property (nonatomic, retain) IBOutlet UIPickerView *tagPickerView;
@property (nonatomic, retain) NSMutableArray *tagPickerData;

в файле .m

    @synthesize tagPickerView;
    @synthesize tagPickerData;

-(void) viewDidLoad{
        tagPickerData = [[NSMutableArray alloc]init];
        [tagPickerView setDelegate:self];
        [tagPickerView setDataSource:self];
    }

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

- (void) imagePickerController: (UIImagePickerController*) reader
     didFinishPickingMediaWithInfo: (NSDictionary*) info
    {
    [tagPickerData addObject:tagString]; //tagString is the value returned from the QRCode reader
}

  #pragma mark -
#pragma mark tagPickerView Data Source Methods
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)tagPickerView{
    return 1;
}

-(NSInteger)pickerView:(UIPickerView *)tagPickerView
numberOfRowsInComponent:(NSInteger)component{
    return [tagPickerData count];


}

#pragma mark tagPickerView Delegate Methods
-(NSString *)pickerView:(UIPickerView *)tagPickerView
            titleForRow:(NSInteger)row
           forComponent:(NSInteger)component{
    return [self.tagPickerData objectAtIndex:row];
}

(Я думаю, это все.)

В IB у меня есть dataSource, делегат и tagPickerView для владельца файла. UIPickerView скрыт до тех пор, пока не будет вызвана команда удаления (в этом случае встряхивание телефона), а затем он появляется поверх всего.

То, что я получаю, это пустой вид сборщика.

Я могу проверить с помощью NSLog, что массив заполняется каждый раз, когда выполняется сканирование, поэтому я знаю, что это не так, что я загружаю пустой массив. Я также могу проверить, что методы источника данных, по-видимому, читаются, потому что я могу изменить количество компонентов на 2, и это отражается, когда поднимается сборщик - два вращающихся колеса. Но я не знаю, как проверить, работает ли метод Delegate.

Я задавался вопросом, есть ли способ заполнить сборщик по команде, например, когда телефон встряхивается, вместо использования делегата ... или это вообще сработает?

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

NSArray *array = [[NSArray alloc] initWithObjects:@"String 1",@"string 2",@string 3",(etc.) ,nil];

Но я не могу найти ничего, что показывает, как загрузить средство выбора из массива, созданного из информации, собранной пользователем. Здравый смысл подсказывает мне, что он должен работать так же, но я научился отказываться от здравого смысла при работе с Objective-C.

Есть ли эксперт по UIPickerView, который может мне помочь?

Спасибо

1 Ответ

1 голос
/ 04 ноября 2011

Всякий раз, когда вы изменяете содержимое массива tagPickerData, вам нужно вызывать [tagPickerView reloadAllComponents]. Сборщик не знает о своих базовых данных - вы должны отправить ему это сообщение, чтобы сообщить ему, что он должен вызывать свои методы источника данных.

...