我有一个UIPickerView。当我选择一行时,会发生这种情况:

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

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

switch ([defaults integerForKey:@"randomIndex"]) {
    case 1:
        switch (component) {
            case 0:
                [defaults setInteger:row forKey:@"randomIndex"];
                [defaults synchronize];
                [colourPicker reloadAllComponents];
                [colourPicker selectRow:[defaults integerForKey:@"randomIndex"] inComponent:0 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"dice1Index"] inComponent:1 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"dice2Index"] inComponent:2 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"colourIndex"] inComponent:3 animated:NO];
                break;
            case 1:
                [defaults setObject:([diceArray objectAtIndex:row]) forKey:@"dice"];
                [defaults setInteger:row forKey:@"dice1Index"];
                [defaults synchronize];
                break;
            case 2:
                [defaults setObject:([diceArray objectAtIndex:row]) forKey:@"dice"];
                [defaults setInteger:row forKey:@"dice2Index"];
                [defaults synchronize];
                break;
            case 3:
                [defaults setObject:([colourArray objectAtIndex:row]) forKey:@"colour"];
                [defaults setInteger:row forKey:@"colourIndex"];
                [defaults synchronize];
                break;
        }
        break;
    case 0:
        switch (component) {
            case 0:
                [defaults setInteger:row forKey:@"randomIndex"];
                [defaults synchronize];
                [colourPicker reloadAllComponents];
                [colourPicker selectRow:[defaults integerForKey:@"randomIndex"] inComponent:0 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"dice1Index"] inComponent:1 animated:NO];
                [colourPicker selectRow:[defaults integerForKey:@"colourIndex"] inComponent:2 animated:NO];
                break;
            case 1:
                [defaults setObject:([diceArray objectAtIndex:row]) forKey:@"dice"];
                [defaults setInteger:row forKey:@"dice1Index"];
                [defaults synchronize];
                break;
            case 2:
                [defaults setObject:([colourArray objectAtIndex:row]) forKey:@"colour"];
                [defaults setInteger:row forKey:@"colourIndex"];
                [defaults synchronize];
                break;
        }
        break;
}


}

在iOS模拟器中,当我进入UIPicker视图并将第一列更改为第二行,然后又回到第一行时,出现SIGABRT致命错误。这是日志:

2011-10-27 16:02:55.516 Random[31369:b303] *** Terminating app due to uncaught exception       'NSRangeException', reason: '*** -[NSMutableArray objectAtIndex:]: index 3 beyond bounds [0 ..   2]'
 *** Call stack at first throw:
 (
0   CoreFoundation                      0x00dc45a9 __exceptionPreprocess + 185
1   libobjc.A.dylib                     0x00f18313 objc_exception_throw + 44
2   CoreFoundation                      0x00dba0a5 -[__NSArrayM objectAtIndex:] + 261
3   UIKit                               0x0000b750 -[UIPickerView      _selectRow:inComponent:animated:notify:] + 125
4   UIKit                               0x0000b6cd -[UIPickerView  selectRow:inComponent:animated:] + 64
5   Random                              0x00004747 -[FlipsideViewController  pickerView:didSelectRow:inComponent:] + 855
6   UIKit                               0x0000bc34 -[UIPickerView  _sendSelectionChangedForComponent:] + 100
7   UIKit                               0x0000ba15 -[UIPickerView  scrollerDidEndSmoothScrolling:] + 75
8   UIKit                               0x001b97c7 -[UIScroller(Internal)  _stopScrollingNotify:dealloc:pin:] + 692
9   UIKit                               0x001bb1d0 -[UIScroller(Static)  _smoothScroll:] + 4743
10  UIKit                               0x001b1488 ScrollerHeartbeatCallback + 129
11  GraphicsServices                    0x00fff3a3 HeartbeatTimerCallback + 35
12  CoreFoundation                      0x00da58c3  __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 19
13  CoreFoundation                      0x00da6e74 __CFRunLoopDoTimer + 1220
14  CoreFoundation                      0x00d032c9 __CFRunLoopRun + 1817
15  CoreFoundation                      0x00d02840 CFRunLoopRunSpecific + 208
16  CoreFoundation                      0x00d02761 CFRunLoopRunInMode + 97
17  GraphicsServices                    0x00ffc1c4 GSEventRunModal + 217
18  GraphicsServices                    0x00ffc289 GSEventRun + 115
19  UIKit                               0x00024c93 UIApplicationMain + 1160
20  Random                              0x00001cb9 main + 121
21  Random                              0x00001c35 start + 53
22  ???                                 0x00000001 0x0 + 1
    )
terminate called throwing an exceptionCurrent language:  auto; currently objective-c
(gdb)


为什么会这样呢?

最佳答案

您对[UIPickerView selectRow:inComponent:animated:]的调用之一是要求系统在只有3行(最大索引:2)的列中选择第四个条目(索引:3)。没有看到更多的代码,我无法告诉您为什么会这样。

08-05 08:20