删除uitableViewCell ios5时显示警报

时间:2012-05-30 08:20:54

标签: ios5 uitableview

我正在实施滑动以删除uitableview中的功能。我能够实现这一点,但现在我希望显示一条警告消息以确认删除。我已经以编程方式创建了tableview。

ViewController.h

@interface ViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
{
    UITableView *tView;
    NSMutableArray *myArray;
    NSIndexPath *lastIndexPath;
}

@property(nonatomic,retain) UITableView *tView;
@property(nonatomic,retain) NSMutableArray *myArray;
@property(nonatomic,retain) NSIndexPath *lastIndexPath;

@end

ViewController.m

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor=[UIColor lightGrayColor];

    myArray = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"10", nil];

    // Do any additional setup after loading the view, typically from a nib.
    tView = [[UITableView alloc] initWithFrame:CGRectMake(30, 30, 700, 800) style:UITableViewStylePlain];
    tView.delegate=self;
    tView.dataSource=self;
    [self.view addSubview:tView];
    [tView release];
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 100.0;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [myArray count];
}

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return YES if you want the specified item to be editable.
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{    
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Confirm Delete" message:@"Are you sure?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Delete", nil];

    [alert show];
    [alert release];
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        lastIndexPath = indexPath;
        NSLog(@"%@......%d",lastIndexPath,lastIndexPath.row);
    }
}

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if(buttonIndex==0)
    {
        NSLog(@"cancel");
    }
    else {
        NSLog(@"delete");
        [myArray removeObjectAtIndex:lastIndexPath.row];    //memory error 
        [tView deleteRowsAtIndexPaths:[NSArray arrayWithObject:lastIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    //..do required thing and return cell
}

我在clickButtonAtIndex方法中获取警报视图的内存错误。我认为它适用于lastIndexPath,但nslog()在lastIndexPath中给出了正确的值。 我做错了什么?

1 个答案:

答案 0 :(得分:1)

我讨厌答案只是说“你不应该这样做”......所以我会解释你为什么会收到错误,然后希望你能更好地判断为什么你真的不应该这样做(从UI的角度来看)。

您收到错误是因为您直接将一个您不拥有的值(您没有保留它)分配给ivar。你可能想说self.lastIndexPath

警报视图直到下一次通过运行循环才真正出现,此时indexPath已被自动释放并且您尝试通过指针访问它。

lastIndexPath = indexPath;更改为self.lastIndexPath = indexPath;可解决内存问题。 (由于您将该属性标记为保留,假设您已将其合成并且未编写自己的处理程序,当您使用self.前缀时,合成访问者将为您保留它。)

(顺便说一句,这就是为什么以不同于您的属性命名您的ivars并不是一个坏主意(例如Apple使用<property_name>_,在我的网站上我使用m<Property_name>这使得很难做出这种错误)。

好的......但回到你不应该这样做的原因....

此时,您的用户通过向左滑动做出了可识别的手势,然后按下了一个标有“删除”的红色按钮......现在您将弹出警报并要求他们确认?真?好的,如果你必须......