ReloadTable崩溃应用程序

时间:2012-01-11 21:02:08

标签: iphone ios xcode uitableview

此代码导致应用崩溃!我在字典中循环,一切都很好。它在for循环中写入-1时有效,但不是,

-(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 个答案:

答案 0 :(得分:1)

我假设您正在使用tableView。显然你正在修改tableView的数据源。从数据源中删除对象时,还必须调整tableView。意思是致电reloadData,或致电[tableView deleteRowsAtIndexPaths:(NSArray *)indexPaths withRowAnimation:(UITableViewRowAnimation)animation]

如果您输入-1,您的应用程序不会崩溃的原因可能是 - 也许 - 因为只有匹配[currentValue intValue] < [finishValue intValue]条件的项目,所以如果您通过{{1}删除该对象后,[projectsTable numberOfRowsInSection:0]-1匹配projectsTable的计数。

但它只适用于一个周期。当下一个周期发生时,在numberOfRowsInSection中,您的应用再次崩溃,除非您将if...loop包含在同一个[projectsTable reloadData]中。

尽管if...loop方法工作得很好,但如果您只是删除一行,或者通过添加或删除对象向表中添加行,则最好使用reloadData或{{1 }} 方法。您的应用程序的开销和工作量会减少,并且会使其更顺畅,更快。

deleteRowsAtIndexPaths通过调用insertRowsAtIndexPaths从tableView中删除相应对象后,使代码正常工作的底线。

或者,您也可以使用[(NSMutableArray *)[projects objectForKey:@"activeProjects"] removeObjectAtIndex:i];deleteRowsAtIndexPaths。有关完整参考,请参阅http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableView_Class/Reference/Reference.html

希望它有所帮助。