2011-10-27 20 views
0

私はUIPickerViewを持っています。私は、行を選択すると、この処理が行われます。SIGABRTの致命的なエラー

- (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シミュレータで

、私は、get最初に戻って、その後UIPickerビュー上に行くと二行に1列を変更したときa 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) 

なぜこのようなことが起こりますか?

答えて

2

[UIPickerView selectRow:inComponent:animated:]への呼び出しの1つは、3行しかない(最大インデックス:2)列の4番目のエントリ(index:3)を選択するようにシステムに要求しています。あなたのコードをもっと見ることなく、なぜこれが起こっているのかは分かりません。

0

あなたの配列は2だけのインデックスしか持っていませんが、既存の配列の3番目のインデックスオブジェクトにアクセスしようとしている行を選択しています。