我有一个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)。没有看到更多的代码,我无法告诉您为什么会这样。