从UITableView中删除自定义行

时间:2014-01-29 15:38:45

标签: ios objective-c uitableview protocols

我只是在练习UITableView。 这是我到目前为止所做的。

  • 从头开始用xib.file创建单元格。
  • 数据存储在P-list中。
  • 使用[ MutableCopy]并将数组转换为mutableArray
  • 看起来有些奇怪,但是我使用故事板建立了委托连接,所以这里没有“self.tableView.delegate = self”行。

现在的问题是我可以删除mutableArray中的对象,但不能删除UI上的对象。我选择的行保留在桌面上。 我知道“- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath”委派方法有效,但出了点问题。

任何建议表示赞赏!感谢:)

![#import "ViewController.h"
#import "Model.h"
#import "SimpleTableCell.h"

@interface ViewController ()
{

    NSMutableArray *_recipesMC;
    NSMutableArray *_imagesMC;

    Model *_model;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    \[super viewDidLoad\];
    // Do any additional setup after loading the view, typically from a nib.

    Model *model = \[\[Model alloc\] init\];
    \[model getBack\];

    NSArray *recipes = model.recipes;
    NSArray *images = model.imagesArray;

    _recipesMC = \[recipes mutableCopy\];
    _imagesMC = \[images mutableCopy\];


}

- (void)didReceiveMemoryWarning
{
    \[super didReceiveMemoryWarning\];
    // Dispose of any resources that can be recreated.
}



# pragma mark delegat patern


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

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
     NSString *cellIdentifier = @"SimpleTableCell";


    SimpleTableCell *cell = (SimpleTableCell *)\[tableView dequeueReusableCellWithIdentifier:cellIdentifier\];


    if(cell == nil)
    {

        NSArray *nib = \[\[NSBundle mainBundle\] loadNibNamed:@"Empty" owner:self options:nil\];
        cell = \[nib objectAtIndex:0\];

    }

    cell.nameLabel.text = \[_recipesMC objectAtIndex:indexPath.row\];

    if (indexPath.row < \[_recipesMC count\] - 1)
    {
        UIImage *image = \[UIImage imageNamed:_imagesMC\[indexPath.row\]\];
        cell.thumbnailImageView.image = image;

    }


    return cell;

}

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

}


# pragma mark delegate touch


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%li",(long)indexPath.row);

    UIAlertView *alert = \[\[UIAlertView alloc\] initWithTitle:@"HEY" message:\[NSString stringWithFormat:@"%@",_recipesMC\[indexPath.row\]\] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil\];
    \[alert show\];

    UITableViewCell *cell = \[tableView cellForRowAtIndexPath:indexPath\];

    if (cell.accessoryType !=
        UITableViewCellAccessoryNone) {


        cell.accessoryType =
        UITableViewCellAccessoryNone;

    }
    else
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }


    \[self performSegueWithIdentifier:@"CellSelectionSegue" sender:self\];

}



- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSLog(@"Clicked DELETE BUTTON at %i",indexPath.row);

    \[_recipesMC removeObjectAtIndex:indexPath.row\];
    \[_imagesMC removeObjectAtIndex:indexPath.row\];

    \[self.tableView reloadData\];

    NSLog(@"count = %i",\[_recipesMC count\]);

}



# pragma mark Segue

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"Segue");
}


@end

3 个答案:

答案 0 :(得分:1)

哟应致电deleteRowsAtIndexPath:wothRowAnimation:

e.g。在我的代码中:

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        ElKeyValuePair *pair = [self.locationFavoritesKeyArr objectAtIndex:[indexPath row]];
        [self.locationFavoritesKeyArr removeObjectAtIndex:[indexPath row]];
        ELCarpark *carpark = [self.agglomeration carparkForUid:[pair.val1 intValue]];
        [carpark removeFromFavoritesAgglomerationUid:self.agglomeration.uid];
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    }

答案 1 :(得分:1)

我非常确定您的self.tableViewnil

这是因为即使你将self设置为datasource和delegate,你的表也可以工作,但是在这里你似乎创建了你的UITableView *tableView但没有通过你的界面链接它(如果你用它来建立它)。

或者您只需拨打tableView而不是self.tableView,因为代理协议会为您提供表格。

只要这样做就可以了。然后,你可以尝试Szu的解决方案。

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSLog(@"Clicked DELETE BUTTON at %i",indexPath.row);

    [_recipesMC removeObjectAtIndex:indexPath.row];
    [_imagesMC removeObjectAtIndex:indexPath.row];

    [tableView reloadData];

    NSLog(@"count = %i",[_recipesMC count]);

}

答案 2 :(得分:0)

将此代码添加到方法tableView:commitEditingStyle:forRowAtIndexPath应该从数据源和UI中删除该行。

if (editingStyle == UITableViewCellEditingStyleDelete)
{
[_recipesMC removeObjectAtIndex:indexPath.row];
[_imagesMC removeObjectAtIndex:indexPath.row];
[tableView deleteRowsAtIndexPaths:indexPath withRowAnimation:YES];
}

最后删除reloadData指令。