Сборщик не распознает последний ряд - PullRequest
1 голос
/ 29 сентября 2010

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

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

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

Количество заголовков в массиве является правильным (например, 7), и когда я выбираю строки "0-5 "это прекрасно работает, но когда я выбираю строку" 6 "(7-я строка), он все еще думает, что я выбираю" 5 ".Таким образом, и шестая, и седьмая строки будут возвращать «5» вместо «5 и 6».

Это происходит для всех трех компонентов, и на самом деле происходит аналогичным образом в другом из моих более простыхсредства выбора в другом месте кода (на самом деле, с этим средством выбора, только когда я прихожу из родительского контроллера представления. Когда я прихожу из дочернего контроллера представления, все в порядке).

Вы можете помочь?

- (void)loadmypicker {
UIPickerView *mypicker = [[UIPickerView alloc] init];
[mypicker setDataSource:self];
[mypicker setDelegate:self];
pickerTitles_Dil = [[NSArray alloc] initWithObjects:@"0", @"1", @"2", @"3", @"4", @"5", @"6", nil];
pickerTitles_Eff = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", @"d", @"e", @"f", @"g", @"h", @"i", @"j", @"k", nil];
pickerTitles_Stat = [[NSArray alloc] initWithObjects:@"A", @"B", @"C", @"D", @"E", @"F", @"G", nil];
[mypicker setShowsSelectionIndicator:YES];
[mypicker selectRow:0 inComponent:0 animated:NO];
[mypicker selectRow:0 inComponent:1 animated:NO];
[mypicker selectRow:0 inComponent:2 animated:NO];
[mypicker setFrame:CGRectMake(0, 98, 320, 253)];
[self addSubview:mypicker];
    [mypicker release];
}

 - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {

if (component == 0)
    return [pickerTitles_Dil objectAtIndex:row];
else if (component == 1)
    return [pickerTitles_Eff objectAtIndex:row];
else return [pickerTitles_Stat objectAtIndex:row];
 }

 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 3;
 }


 - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
if (component == 0)
{return [pickerTitles_Dil count];
}
else if (component == 1)
{return [pickerTitles_Eff count];
}
else 
{return [pickerTitles_Stat count];
}
   }

 - (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
NSLog (@"row: %d, component :%d", row, component);
 }

Спасибо за помощь!

У кого-нибудь еще была такая проблема?Подводя итог, сборщик показывает последний ряд, но я не могу выбрать его.Спасибо!

Ответы [ 2 ]

1 голос
/ 19 октября 2010

Исправлена ​​проблема: высота сборщика может быть не более 216. Поскольку я перешел на 253, все остальные проблемы последовали.Спасибо!

0 голосов
/ 01 октября 2010

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

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component

Что произойдет, если вы попытаетесь использовать следующий метод для этого?

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

Может быть, это поможет?Но я не уверен, что это поможет вам.

РЕДАКТИРОВАТЬ: Попробуйте что-то вроде этого, новый метод не может возвращать строки напрямую, но ему нужны представления:

 /* Because the UIPickerView expects a UIView for every row you insert in the UIPickerView, you need to make one. What I do here is really simple. I create a UILabel* and with each row it requests I just change the text in the UILabel. */

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
    {
    /* Create a UILabel and set it 40 pixels to the right, to make sure it is put nicely in the UIPickerView */
        UILabel *label = [[[UILabel alloc] initWithFrame:CGRectMake(40, 0, 280, 25)] autorelease];
        label.textColor = [UIColor blackColor];
        label.backgroundColor = [UIColor clearColor];

        switch (row)
        {
            default:
            case kUnderClock:
                label.text = @"Under clock";
                break;
            case kAboveSlider:
                label.text = @"Above lock slider";
                break;
            case kCenter:
                label.text = @"Vertically centered";
                break;
        }

        return label;
    }

Извините за отступпроблема, скопировал это прямо из моего блога.

...