pickerViews 崩溃

pickerViews crashes

这是我的代码:

@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];
 }
}

这是给了我

Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 1 beyond bounds [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]]];
}

您调用了错误的方法来实现方法

-(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];
 }
}

您已将问题缩小到以下代码:

-(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 个组件,因此您需要从所有三个拾取器中 select 个组件 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];
}

避免在一行代码中放置多个方法调用。如果出现问题,它会降低代码的可读性和调试难度。