此代码导致应用崩溃!我在字典中循环,一切都很好。它在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!! :(
}
答案 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
希望它有所帮助。