我正在编写一个应用程序来显示门户网站的一些新闻。使用来自Internet的JSON文件获取新闻,然后使用CoreData模型将其存储到NSMutableArray中。显然,用户无法从Internet上的JSON文件中删除新闻,但他可以在本地隐藏它们。问题出现在这里,我有以下代码:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if (editingStyle == UITableViewCellEditingStyleDelete) {
if( !moc ){
moc = [[NewsFetcher sharedInstance] managedObjectContext];
}
[[dataSet objectAtIndex:indexPath.row] setEliminata:[NSNumber numberWithBool:YES]];
NSError *error;
if( ![moc save:&error] ){
NSLog( @"C'è stato un errore!" );
}
[dataSet removeObjectAtIndex:indexPath.row];
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:YES];
}
该行:
[数据集 removeObjectAtIndex:indexPath.row];
导致我的应用崩溃并出现以下错误:
2010-07-12 19:08:16.021 ProvaVideo [284:207] * - [_ PFArray removeObjectAtIndex:]:无法识别 选择器发送到实例0x451c820 2010-07-12 19:08:16.022 ProvaVideo [284:207] * 终止 应用程序由于未捕获的异常 'NSInvalidArgumentException',原因: '*** - [_ PFArray removeObjectAtIndex:]: 无法识别的选择器发送到实例 0x451c820'
我试图理解为什么它不起作用但我不能。 如果我重新启动应用程序,则会正确地以逻辑方式取消新应用程序。 有什么建议??提前谢谢。
接口:
@interface ListOfVideo : UITableViewController <NSFetchedResultsControllerDelegate> {
NSMutableArray *dataSet;
}
@property (nonatomic, retain) NSMutableArray *dataSet;
// In the .m file:
@synthesize dataSet;
viewDidLoad
中的初始化:
dataSet = (NSMutableArray *) [[NewsFetcher sharedInstance]
fetchManagedObjectsForEntity:@"News"
withPredicate:predicate
withDescriptor:@"Titolo"];
[dataSet retain];
updateDatabase
...这是从网上检查新消息时,我将它们添加到MutableArray中:
[dataSet addObject:theNews];
答案 0 :(得分:23)
你的NewsFetcher
会返回一个不可变数组,而不是一个可变实例。使用以下代码进行初始化:
NSArray *results = [[NewsFetcher sharedInstance]
fetchManagedObjectsForEntity:@"News"
withPredicate:predicate
withDescriptor:@"Titolo"];
dataSet = [results mutableCopy];
像A *a = (A*)b;
这样的表达式只将指针强制转换为其他类型 - 它不会转换/更改它指向的实例的实际类型。
答案 1 :(得分:5)
验证dataSet是否为NSMutableArray。抛出异常是因为它没有响应removeObjectAtIndex。
答案 2 :(得分:1)
jdot是正确的dataSet必须是NSMutableArray ..
你必须这样做..
dataSet = [NSMutableArray arrayWithArray:[[NewsFetcher sharedInstance]
fetchManagedObjectsForEntity:@"News"
withPredicate:predicate
withDescriptor:@"Titolo"]];
现在,dataSet是您从NewsFetcher获得的数组的可变实例,它在删除对象时不会崩溃。