UITableView deleteRowsAtIndexPaths не удаляет строку - PullRequest
2 голосов
/ 07 апреля 2011

У меня есть UIView, разработанный в IB, и UITableView на нем. В представлении метода viewDidLoad контроллера я запускаю свой пользовательский UITableViewContoller и задаю источник данных и делегат:

- (void)viewDidLoad {
    [super viewDidLoad];
    ...
    GoodsTableController *goodsController = [[GoodsTableController alloc] init];
    goodsController.data = [[orderData objectForKey:@"Result"] objectForKey:@"Items"];
    self.gtc = goodsController;
    [goodsController release];

    goodsTable.delegate = self.gtc;
    goodsTable.dataSource = self.gtc;
    [goodsTable reloadData];}

Интересное в GoodsTableController:

//in the header file
@interface GoodsTableController : UITableViewController {
        NSMutableArray *data;
}

@property (nonatomic, retain) NSMutableArray *data;

//implementation

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        NSLog(@"Current data size %d", [data count]);
        return [data count];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
        if (editingStyle == UITableViewCellEditingStyleDelete) {
                NSLog(@"Deleting row at index %d", indexPath.row);
                [self.tableView beginUpdates];

                [self.data removeObjectAtIndex:indexPath.row];
                [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

                [self.tableView endUpdates];
                [self.tableView reloadData];
        }
}

Для отладки я использовал NSLog, и я увидел, что массив был изменен, его размер был изменен, вызвано tableView: numberOfRowsInSection, , но таблица не обновляется. Строка не прячется. Это журнал:

2011-04-07 13:08:18.784 Test[32300:207] Current data size 2 //first call tableView:numberOfRowsInSection: by reloadData in View Controller after set data
2011-04-07 13:08:23.486 Test[32300:207] Current data size 2 //call after slide on row
2011-04-07 13:08:26.091 Test[32300:207] Deleting row at index 0 
2011-04-07 13:08:26.093 Test[32300:207] Current data size 1 //call after endUpdate
2011-04-07 13:08:26.096 Test[32300:207] Current data size 1 //call after reloadData

Ответы [ 3 ]

1 голос
/ 17 февраля 2013

Я исследовал механизм удаления, вставки и перезагрузки UITableView.Я поддерживаю свой проект в Github, решая эту проблему.

https://github.com/VansonLeung/VanTableController

Он включает в себя тестирование рабочего модуля.Обычно для того, чтобы анимировать анимацию ячейки UITableView, мы должны сделать что-то вроде этого:

[tableView_ beginUpdates];
[tableView_ deleteRowsAtIndexPaths: indexPathDelete withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView_ insertRowsAtIndexPaths: indexPathInsert withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView_ reloadRowsAtIndexPaths: indexPathReload withRowAnimation:UITableViewRowAnimationAutomatic];
[tableView_ endUpdates];

Мы должны определить удаление строк, вставить строки и перезагрузить массивы indexPath строк, и это очень неприятная работа!Моя работа над проектом в основном является оболочкой для генерации indexPath, чтобы облегчить жизнь.

0 голосов
/ 07 апреля 2011

Проблема была в неопределенном табличном представлении в экземпляре GoodsTableController. Фиксированный код:

- (void)viewDidLoad {
        [super viewDidLoad];
        ...
        GoodsTableController *goodsController = [[GoodsTableController alloc] init];
        goodsController.data = [[orderData objectForKey:@"Result"] objectForKey:@"Items"];
        self.gtc = goodsController;
        [goodsController release];

        goodsTable.delegate = self.gtc;
        goodsTable.dataSource = self.gtc;

        //Fix there:
        self.gtc.tableView = goodsTable;  
        [goodsTable reloadData];
}
0 голосов
/ 07 апреля 2011

Попробуйте это

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

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

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView   dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero   reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.selectionStyle = UITableViewCellSelectionStyleBlue;
    cell.textLabel.text = [NSMutableArray objectAtIndex:indexPath.row];
    return cell;
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)aTableView  editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (!indexPath) return
    {
        UITableViewCellEditingStyleNone;
    }

    if (indexPath.row == ([NSMutableArray count]))
    {
        return UITableViewCellEditingStyleInsert;
    }
    else
    {
        return UITableViewCellEditingStyleDelete;
    }

    return UITableViewCellEditingStyleNone;
}

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Code for do anything after select row in table view
}

- (void)tableView:(UITableView *)aTableView  commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        [recordedFileList removeObjectAtIndex:indexPath.row];
        [recordTableView reloadData];
    }
}

- (BOOL)tableView:(UITableView *)tableView   canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)tableView:(UITableView *)tableView  moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath
{
    NSString *item = [[NSMutableArray objectAtIndex:fromIndexPath.row] retain];
    [NSMutableArray removeObject:item];
    [NSMutableArray insertObject:item atIndex:toIndexPath.row];
    [item release];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...