Почему происходит сбой моего многокомпонентного UIPickerView? - PullRequest
1 голос
/ 24 июля 2010

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

Некоторая конкретная информация о том, что я делаю: (пропустите последний абзац проблемы)

Левое колесо вращает столбец «сто», а правое колесо вращает столбец «десять», так что по сути вы создаете одно значение из двух колес. Все, что я хочу сделать, это позволить пользователю создать значение 0, 10, 20, 30 ... 990, 1000 (каждые десять единиц до 1000). Первый компонент легко маркировать, но у меня есть два массива для заполнения метки строк второго компонента. Первый массив для второго компонента создает метку 00 - 90, второй массив (для случая, когда выбрана 1000) просто имеет значение 00. Поэтому, когда пользователь хочет выбрать 1000, 10 находится на первом колесе, а 00 - на втором. Я изменяю количество строк для второго компонента колеса, когда первый компонент колеса находится в строке 10. Теперь второй компонент показывает только «00». Мой метод didSelectRow использует матрицу для значений от 0 до 990 и прекрасно работает. И я просто делаю строку и преобразовываю ее в число, когда пользователь выбирает 1000, используя операторы if.

Проблема в том редком случае, когда пользователь вращает Компонент 0, чтобы создать значение «1000» (последняя строка), и если он начал вращать второй компонент, прежде чем первый компонент сможет остановить вращение. (в основном вращается в спешке!), приложение вылетает. Я думаю, что он пытается найти значение для строки, которая не существует. У меня есть другие части моего приложения, которые работают аналогично, и они также аварийно завершают работу в той же ситуации. Есть ли проблема с моим подходом к изменению количества строк / меток для строк на основе выбора другого компонента? Или это что-то простое в моем коде?

Спасибо за чтение и заранее спасибо за любую помощь!

Вот код:

 //Baggage Array
        baggageHundredsArray = [[NSMutableArray alloc] init];
        for (int i = 1; i <= 10; i++) {
            NSString *myBagString = [NSString stringWithFormat:@"%d", i];
            [baggageHundredsArray addObject:myBagString];
        }
        [baggageHundredsArray insertObject:@"- " atIndex:0];


        baggageTensArray = [[NSMutableArray alloc] init];
        for (int i = 10; i <= 90; i = i + 10) {
            NSString *myBagString2 = [NSString stringWithFormat:@"%d lbs.", i];
            [baggageTensArray addObject:myBagString2];
        }
        [baggageTensArray insertObject:@"00 lbs." atIndex:0];

        baggageTensArray2 = [[NSMutableArray alloc] init];
        [baggageTensArray2 insertObject:@"00 lbs." atIndex:0];


    - (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component {
    if (thePickerView == baggagePicker) {
                NSInteger numComps2 = 0;
                switch (component)
                {
                    case 0:
                        numComps2 = [baggageHundredsArray count];
                        break;
                    case 1:



                    if ([baggagePicker selectedRowInComponent:0] <= 9) 
                    {
                        numComps2 = [baggageTensArray count];
                    }

                    else 
                    {
                        numComps2 = [baggageTensArray2 count];
                    }
                    break;
            }
            return numComps2;
        }
}

    - (UIView *)pickerView:(UIPickerView *)pickerView
                viewForRow:(NSInteger)row
              forComponent:(NSInteger)component
               reusingView:(UIView *)view {

        UILabel *pickerLabel = (UILabel *)view;

    if (pickerView == baggagePicker) {
                       if ((pickerLabel == nil) || ([pickerLabel class] != [UILabel class])) {  //newlabel
                           CGRect frame = CGRectMake(0.0, 0.0, 110, 32.0);
                           pickerLabel = [[[UILabel alloc] initWithFrame:frame] autorelease];
                           pickerLabel.textAlignment = UITextAlignmentLeft;
                           pickerLabel.backgroundColor = [UIColor clearColor];
                           pickerLabel.font = [UIFont boldSystemFontOfSize:12];
                       }            
                       pickerLabel.textColor = [UIColor blackColor];


                       switch (component)
                       {
                           case 0:
                               //CGRect frame = CGRectMake(0.0, 0.0, 80, 32);
                               //pickerLabel = [[[UILabel alloc] initWithFrame:frame] autorelease];
                               [pickerLabel setTextAlignment:UITextAlignmentRight];
                               [pickerLabel setBackgroundColor:[UIColor clearColor]];
                               [pickerLabel setFont:[UIFont boldSystemFontOfSize:23]];
                               [pickerLabel setTextColor:[UIColor blackColor]]; 
                               [pickerLabel setText:[baggageHundredsArray objectAtIndex:row]];
                               break;

                           case 1:


                               if ([baggagePicker selectedRowInComponent:0] <= 9) {

                                                               [pickerLabel setTextAlignment:UITextAlignmentLeft];
                                   [pickerLabel setBackgroundColor:[UIColor clearColor]];
                                   [pickerLabel setFont:[UIFont boldSystemFontOfSize:21]];
                                   [pickerLabel setTextColor:[UIColor blackColor]];
                                   [pickerLabel setText:[baggageTensArray objectAtIndex:row]];
                               }

                               else 
                               {
                                                               [pickerLabel setTextAlignment:UITextAlignmentLeft];
                                   [pickerLabel setBackgroundColor:[UIColor clearColor]];
                                   [pickerLabel setFont:[UIFont boldSystemFontOfSize:21]];
                                   [pickerLabel setTextColor:[UIColor blackColor]];
                                   [pickerLabel setText:[baggageTensArray2 objectAtIndex:row]];

                               }
                                                   break;   }
                       return pickerLabel;  
                   }


    - (void)pickerView:(UIPickerView *)thePickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
    {

    if (thePickerView == baggagePicker) {

                [baggagePicker reloadAllComponents];

                 NSInteger hundredsWheel = [thePickerView selectedRowInComponent:0];
                 NSInteger tensWheel  = [thePickerView selectedRowInComponent:1];
                 //lbs.
                 int column5 [10][10] = {
                 {0,10,20,30,40,50,60,70,80,90},
                 {100,110,120,130,140,150,160,170,180,190},
                 {200,210,220,230,240,250,260,270,280,290},
                 {300,310,320,330,340,350,360,370,380,390},
                 {400,410,420,430,440,450,460,470,480,490},
                 {500,510,520,530,540,550,560,570,580,590},
                 {600,610,620,630,640,650,660,670,680,690},
                 {700,710,720,730,740,750,760,770,780,790},
                 {800,810,820,830,840,850,860,870,880,890},
                 {900,910,920,930,940,950,960,970,980,990},
                 };



                             // Totals Label
                 if (hundredsWheel <= 9) {

                     myBaggageString = [NSString stringWithFormat:@"%i", (column5[hundredsWheel][tensWheel])];
                     baggageWeightLabel.text = myBaggageString;
                     baggageWeightInt = [myBaggageString intValue];

                     baggageWeightFloat = [myBaggageString floatValue];
                     baggageMomentFloat = baggageWeightFloat * 731.10;

                     [self calculateWeight];
                     paxViewBaggageWeightLabel.text = myBaggageString;

                     NSLog(@"value of myBaggageString is %@", myBaggageString);
                     [baggagePicker reloadAllComponents];


                 }

                 if (hundredsWheel == 10){
                     myBaggageString = [NSString stringWithFormat:@"1000"];//, [lastFuelValues objectAtIndex: [weightPicker selectedRowInComponent:1]]];
                     baggageWeightLabel.text = myBaggageString;
                     baggageWeightInt = [myBaggageString intValue];

                     baggageWeightFloat = [myBaggageString floatValue];
                     baggageMomentFloat = baggageWeightFloat * 731.10;

                     [self calculateWeight];
                     paxViewBaggageWeightLabel.text = myBaggageString;
                     [baggagePicker reloadAllComponents];
                 }
...