ReloadTable вылетает приложение - PullRequest
0 голосов
/ 12 января 2012

Этот код вызывает сбой приложения! Я перебираю словарь и все нормально выходит из системы. Это работает, когда я пишу -1 в цикле for, но не иначе,

-(void)updateProjectTimes {
for(int i = 0; i < [projectsTable numberOfRowsInSection:0]-1; i++) {
    NSString *currentValue = [[[projects objectForKey:@"activeProjects"] objectAtIndex:i] objectForKey:@"timepassed"];
    NSString *finishValue = [[[projects objectForKey:@"activeProjects"] objectAtIndex:i] objectForKey:@"timeleft"];
    if([currentValue intValue] < [finishValue intValue]) {
        [[[projects objectForKey:@"activeProjects"] objectAtIndex:i] setObject:[NSString stringWithFormat:@"%d", ([currentValue intValue] + 1)] forKey:@"timepassed"];
    } else {
        [(NSMutableArray *)[projects objectForKey:@"activeProjects"] removeObjectAtIndex:i];
        if([[projects objectForKey:@"activeProjects"] count] == 0) {
            [projectTimer invalidate];
            projectTimer = nil;
        }
    }
    //[projectsTable reloadData]; works if i put it here!
}
[projectsTable reloadData]; //<- But not here!! :(
}

1 Ответ

1 голос
/ 12 января 2012

Я полагаю, вы работаете с tableView.Видимо, вы модифицируете источник данных вашего tableView.Когда вы удаляете объект из источника данных, вы также должны настроить свой tableView.Это означает либо вызов reloadData, либо вызов [tableView deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation].

Причина, по которой ваше приложение не падает, если вы введете -1, может быть - возможно, - потому что есть только элемент, который соответствует [currentValue intValue] < [finishValue intValue] условие, так что если вы пройдете через [projectsTable numberOfRowsInSection:0]-1, после удаления этого объекта, numberOfRowsInSection соответствует количеству projectsTable.

Но это хорошо только для одного цикла.Когда происходит следующий цикл, в if...loop ваше приложение снова падает, если только вы не включите [projectsTable reloadData] в тот же if...loop.

Хотя метод reloadData работает просто отлично, но если выпросто удаляете строку или добавляете строку в таблицу, добавляя или удаляя объекты, лучше использовать методы deleteRowsAtIndexPaths или insertRowsAtIndexPaths.Это снизит нагрузку и работу вашего приложения и сделает его более плавным и быстрым.

Суть в том, чтобы ваш код работал, сразу после [(NSMutableArray *)[projects objectForKey:@"activeProjects"] removeObjectAtIndex:i]; удалите соответствующий объект из вашего tableView, вызвав deleteRowsAtIndexPaths.

Кроме того, вы также можете использовать beginUpdates и endUpdates.Для полной справки обратитесь к http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...