Reputation: 3172
I have got a UIPickerView. When I select a row, this happens:
- (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;
}
}
In the iOS Simulator, when I go onto the UIPicker View and change the 1st column to the second row and then back to the first a get a SIGABRT
fatal error. Here is the log:
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)
Why is this happening?
Upvotes: 0
Views: 615
Reputation: 5540
your array is having indexes unto 2 only.But you when you are selecting row it is trying to access the 3rd index object in the array which is not existing.So try to focus on the array count
Upvotes: 0
Reputation: 7946
One of your calls to [UIPickerView selectRow:inComponent:animated:]
is asking the system to select the fourth entry (index: 3) in a column that only has 3 rows (max index: 2). Without seeing more of your code I cannot tell you why this is happening.
Upvotes: 2