2016-02-09 6 views
0

Вот мой код:pickerViews врежется

@synthesize pickerLetter, pickerNumber, pickerSymbol; 


- (void)viewDidLoad { 
[super viewDidLoad]; 
letters = [[NSArray alloc]initWithObjects:@"a", @"b", @"c", nil]; 
numbers = [[NSArray alloc]initWithObjects:@"1", @"2", @"3", nil]; 
symbols = [[NSArray alloc]initWithObjects:@"+", @"-", @"/", nil]; 
} 

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

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
if (pickerView == pickerLetter) { 
    return letters.count; 
} else if (pickerView == pickerNumber){ 
    return numbers.count; 
} else { 
    return symbols.count; 
} 
} 

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
if (pickerView == pickerLetter) { 
    return [letters objectAtIndex:row]; 
} else if (pickerView == pickerNumber){ 
    return [numbers objectAtIndex:row]; 
} else { 
    return [symbols objectAtIndex:row]; 
} 
} 

Это дает мне

Нагрузочному приложение из-за неперехваченное исключение 'NSRangeException', причина: «*** - [__ NSArrayM objectAtIndex]: индекс 1 за пределами границ [0 .. 0] '

Когда я использую сборщики в симуляторе.

код, который вызывает сбой в

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
label.text = [NSString stringWithFormat:@"%@ %@ %@",[letters objectAtIndex:[pickerLetter selectedRowInComponent:0]],[numbers objectAtIndex:[pickerNumber selectedRowInComponent:1]],[symbols objectAtIndex:[pickerSymbol selectedRowInComponent:2]]]; 
} 
+2

Какая строка кода вызывает исключение? – rmaddy

+0

он рушится каждый раз, когда я перемещаю сборщики на другой элемент массивов – fabersky

+0

, если я не играю с сборщиками, он работает правильно и отображается правильно – fabersky

ответ

2

Вы сузили вниз по вашей проблеме к этому коду:

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    label.text = [NSString stringWithFormat:@"%@ %@ %@",[letters objectAtIndex:[pickerLetter selectedRowInComponent:0]],[numbers objectAtIndex:[pickerNumber selectedRowInComponent:1]],[symbols objectAtIndex:[pickerSymbol selectedRowInComponent:2]]]; 
} 

Но эта линия имеет несколько звонков в objectAtIndex:, поэтому трудно точно знать точные вопросы. Плюс этот код трудно читать и невозможно отлаживать. Начните разделив этот код следующим образом:

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    NSInteger letterIndex = [pickerLetter selectedRowInComponent:0]; 
    NSString *letter = letters[letterIndex]; 
    NSInteger numberIndex = [pickerNumber selectedRowInComponent:1]; 
    NSString *number = numbers[numberIndex]; 
    NSInteger symbolIndex = [pickerSymbol selectedRowInComponent:2]; 
    NSString *symbol = symbols[symbolIndex]; 

    label.text = [NSString stringWithFormat:@"%@ %@ %@", letter, number, symbol]; 
} 

Делая это, вы сможете сузить реальную причину проблемы.

Как вы можете видеть, проблема в том, что вы ссылаетесь на неправильный номер компонента из pickerNumber и pickerSymbol. Все три сборщика имеют только один компонент, поэтому вам нужно выбрать компонент 0 из всех трех сборщиков.

Необходимый код:

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    NSInteger letterIndex = [pickerLetter selectedRowInComponent:0]; 
    NSString *letter = letters[letterIndex]; 
    NSInteger numberIndex = [pickerNumber selectedRowInComponent:0]; 
    NSString *number = numbers[numberIndex]; 
    NSInteger symbolIndex = [pickerSymbol selectedRowInComponent:0]; 
    NSString *symbol = symbols[symbolIndex]; 

    label.text = [NSString stringWithFormat:@"%@ %@ %@", letter, number, symbol]; 
} 

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

-1

вы вызываете неправильный путь для реализации метода

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
if (pickerView == pickerLetter) { 
    return [letters objectAtIndex:row]; 
} else if (pickerView == pickerNumber){ 
    return [numbers objectAtIndex:row]; 
} else { 
    return [symbols objectAtIndex:row]; 
} 
} 

изменить его

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
if (component == 0) { 
    return [letters objectAtIndex:row]; 
} else if (component == 1){ 
    return [numbers objectAtIndex:row]; 
} else { 
    return [symbols objectAtIndex:row]; 
} 
} 
+0

Нет, это неверно. Код OP правильный для этих методов.ОП имеет 3 отдельных вида выбора с одним компонентом каждый. – rmaddy

Смежные вопросы