2011-10-27 176 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; 
} 

}

在iPhone模擬器,當我去到UIPicker查看1列切換到第二排,然後回到第一個get一個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:]的調用之一是要求系統在只有3行(最大索引:2)的列中選擇第四個條目(索引:3)。沒有看到更多的代碼,我不能告訴你爲什麼會發生這種情況。

0

您的數組只有索引值爲2。但是當您選擇行時,它嘗試訪問數組中不存在的第3個索引對象。所以嘗試着重於數組數目