开发者

Deleted a row/cell in UITableView, but the deleted row still showed on screen

i wrote the following snippet according to The iPhone Developer's Cookbook C5 - Tables 07a - Delete:

-(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];
}

after building, i pressed the "edit" button on the navigation bar and there showed a red "-" for deletion. but nothing on screen changed. after multiple "-" hits, the app crashed. the output is:

> 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'

The NSLog showed that history (which is a NSMutableArray) have been changed actually. I built The iPhone Developer's Cookbook C5 - Tables 07a - Delete and found a similar crash happened, where tableView: numberOfRowsInSection: was called only once. but DeleteMeController in Beginning iPhone 3 Development 09 Nav successfully deleted a row and tableView: numberOfRowsInSection: was called every time once tableView: commitEditingStyle: forRowAtIndexPath: was called. iPhone Developer's Cookbook's code was written manually, and Beginning iPhone 3 Development used Interface Builder.

Any clues on what's wrong?


-(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];
       }
}


Cool ... i Got new Solution. for showing editing Style

if(tableView.isEditing){
    [tableView setEditing:FALSE animated:YES];
    [tableView setNeedsLayout];
}else{
    [tableView setEditing:TRUE animated:YES];        
    [tableView setNeedsLayout];
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜