2011-07-12 71 views
1

I根據iPhone開發的食譜C5寫了下面的代碼片段 - 表07A - 刪除:刪除了的UITableView行/單元格,但刪除的行仍然顯示在屏幕上

-(void)viewDidLoad{ 
    history=[[NSMutableArray alloc]initWithObjects:@"a",@"b",@"c",@"d",@"e",nil]; 
} 
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    NSLog(@"return %d",[history count]); 
    return [history count]; 
} 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell=[self.tableView dequeueReusableCellWithIdentifier:@"any-cell"]; 
    if(cell==nil) 
     cell=[[[UITableViewCell alloc]initWithFrame:CGRectZero reuseIdentifier:@"any-cell"]autorelease]; 
    cell.textLabel.text=[history objectAtIndex:[indexPath row]]; 
    cell.textLabel.textColor=[UIColor blackColor]; 
    cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator; 
    return cell; 
} 
- (void)tableView:(UITableView *)tableView 
commitEditingStyle:(UITableViewCellEditingStyle)editingStyle 
forRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"[history count]=%d",[history count]); 
    NSLog(@"[indexPath row]=%d",[indexPath row]); 
    [history removeObjectAtIndex:[indexPath row]]; 
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
} 

建成後,我按了導航欄上的「編輯」按鈕,並顯示一個紅色的「 - 」進行刪除。但屏幕上沒有任何改變。經過多次「 - 」點擊後,應用程序崩潰。輸出:

> 2011-07-13 05:16:34.128 test[13141:207] return 5 2011-07-13 
> 05:16:37.909 test[13141:207] [history count]=5 2011-07-13 05:16:37.910 
> test[13141:207] [indexPath row]=0 2011-07-13 05:16:39.069 
> test[13141:207] [history count]=4 2011-07-13 05:16:39.070 
> test[13141:207] [indexPath row]=0 2011-07-13 05:16:39.653 
> test[13141:207] [history count]=3 2011-07-13 05:16:39.654 
> test[13141:207] [indexPath row]=0 2011-07-13 05:16:40.069 
> test[13141:207] [history count]=2 2011-07-13 05:16:40.070 
> test[13141:207] [indexPath row]=0 2011-07-13 05:16:40.509 
> test[13141:207] [history count]=1 2011-07-13 05:16:40.510 
> test[13141:207] [indexPath row]=0 2011-07-13 05:16:41.581 
> test[13141:207] [history count]=0 2011-07-13 05:16:41.582 
> test[13141:207] [indexPath row]=0 2011-07-13 05:16:41.589 
> test[13141:207] *** Terminating app due to uncaught exception 
> 'NSRangeException', reason: '*** -[NSMutableArray 
> removeObjectAtIndex:]: index 0 beyond bounds for empty array' 
> *** Call stack at first throw: (
>  0 CoreFoundation      0x00db3be9 __exceptionPreprocess + 185 
>  1 libobjc.A.dylib      0x00f085c2 objc_exception_throw + 47 
>  2 CoreFoundation      0x00dacadf -[__NSArrayM removeObjectAtIndex:] + 415 
>  3 Â∞èËaæáßò‰π¶      0x00004614 -[CallHistory tableView:commitEditingStyle:forRowAtIndexPath:] + 182 
>  4 UIKit        0x003262ea -[UITableView(UITableViewInternal) animateDeletionOfRowWithCell:] + 101 
>  5 UIKit        0x002bca6e -[UIApplication sendAction:to:from:forEvent:] + 119 
>  6 UIKit        0x0034b1b5 -[UIControl sendAction:to:forEvent:] + 67 
>  7 UIKit        0x0034d647 -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 527 
>  8 UIKit        0x0034c1f4 -[UIControl touchesEnded:withEvent:] + 458 
>  9 UIKit        0x002e10d1 -[UIWindow _sendTouchesForEvent:] + 567 
>  10 UIKit        0x002c237a -[UIApplication sendEvent:] + 447 
>  11 UIKit        0x002c7732 _UIApplicationHandleEvent + 7576 
>  12 GraphicsServices     0x016e9a36 PurpleEventCallback + 1550 
>  13 CoreFoundation      0x00d95064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52 
>  14 CoreFoundation      0x00cf56f7 __CFRunLoopDoSource1 + 215 
>  15 CoreFoundation      0x00cf2983 __CFRunLoopRun + 979 
>  16 CoreFoundation      0x00cf2240 CFRunLoopRunSpecific + 208 
>  17 CoreFoundation      0x00cf2161 CFRunLoopRunInMode + 97 
>  18 GraphicsServices     0x016e8268 GSEventRunModal + 217 
>  19 GraphicsServices     0x016e832d GSEventRun + 115 
>  20 UIKit        0x002cb42e UIApplicationMain + 1160 
>  21 Â∞èËaæáßò‰π¶      0x0000229c main + 106 
>  22 Â∞èËaæáßò‰π¶      0x00002229 start + 53 
>  23 ???         0x00000001 0x0 + 1) 
terminate called after throwing an instance of 'NSException' 

NSLog表明,歷史(這是一個NSMutableArray)已實際改變。我構建了iPhone開發人員手冊C5 - 表07a - 刪除並發現了類似的崩潰事件,其中tableView:numberOfRowsInSection:僅被調用一次。但DeleteMeController在Beginning iPhone 3 Development 09 Nav中成功刪除了一行,並且tableView: numberOfRowsInSection:每次調用tableView: commitEditingStyle: forRowAtIndexPath:時都被調用。 iPhone Developer's Cookbook的代碼是手動編寫的,而Beginning iPhone 3 Development使用Interface Builder。

任何線索有什麼不對?

回答

2
-(void)tableView:(UITableView *)tableView commitEditingStyle: UITableViewCellEditingStyle) editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { 
     if (editingStyle == UITableViewCellEditingStyleDelete) { 
       [history removeObjectAtIndex:indexPath.row]; 
       [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationMiddle]; 
     [tableView endUpdates]; 
     [tableView reloadData]; 
     } 
} 
+0

耶和[tableView endUpdates]; [tableView reloadData];有效!謝謝你kalpesh! – DamningGodson

+0

只有[tableView endUpdates];它也運作良好! – DamningGodson

+0

啊......你救了我的命!謝謝你。 :) –

0

酷...我有新的解決方案。用於顯示編輯樣式

if(tableView.isEditing){ 
    [tableView setEditing:FALSE animated:YES]; 
    [tableView setNeedsLayout]; 
}else{ 
    [tableView setEditing:TRUE animated:YES];   
    [tableView setNeedsLayout]; 
} 
相關問題