pickerViews崩溃了

时间:2016-02-09 23:26:00

标签: ios objective-c exception uipickerview

这是我的代码:

@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 个答案:

答案 0 :(得分: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];
}

这样做可以缩小问题的真正原因。

正如您所看到的,问题是您引用了pickerNumberpickerSymbol中错误的组件编号。所有三个选择器只有1个组件,因此您需要从所有三个选择器中选择组件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 :(得分:-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];
 }
}