我对从tableview中删除行的简单操作有点迷失。我有一个带有一个名为SUBJECT的表的sqlite数据库,我想删除该表的记录,从数组中删除该成员并删除tableview中的条目。我不知道什么序列是最好的,我一直在收到错误。
以下是代码:
- (void)tableView:(UITableView *)tv commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
if(editingStyle == UITableViewCellEditingStyleDelete) {
QuotesAppDelegate *appDelegate = (QuotesAppDelegate *)[[UIApplication sharedApplication] delegate];
//Get the object to delete from the array.
Subject *sub = [self.subjects objectAtIndex:indexPath.row];
// check if there are any quoteMaps for this subject and if so do not do it
NSArray *qm = [appDelegate getQuoteMapsFromSubId:sub.subject_id];
if (qm.count==0){
//Delete the object from the table.
[self.subjects removeObjectAtIndex:indexPath.row];
[tv deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[sub deleteSubject];
} else {
//DON'T DO IT BUT GIVE A WARNING INSTEAD
}
}
}
我在self.subjects removeObject .... line:
上收到以下错误-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x6b2a8f0
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
'-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x6b2a8f0'
错误消息显示我的self.subjects是一个NSArray但我的标题将其指定为NSMutableArray:
@interface SubjectViewController : UITableViewController <UIAlertViewDelegate> {
NSMutableArray *subjects;
}
@property (nonatomic, retain) NSMutableArray *subjects;
为什么要改为NSArray ???
我检查过并发现Parent ViewController正在分配以下内容:
NSPredicate *catFilter = [NSPredicate predicateWithFormat:@"category_title == %@", cat.category_title];
NSArray *subs = [appDelegate.subjects filteredArrayUsingPredicate:catFilter];
subViewController.subjects = (NSMutableArray *) subs;
看起来问题就在那里。
如果我注释掉self.subjects removeObject并尝试运行下一行“tv deleteRowsAtIndexPaths ...”,我会收到以下错误:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'Invalid update: invalid number of rows in section 0. The number of rows
contained in an existing section after the update (1) must be equal to the number
of rows contained in that section before the update (1), plus or minus the number
of rows inserted or deleted from that section (0 inserted, 1 deleted) and plus or
minus the number of rows moved into or out of that section (0 moved in, 0 moved out).'
到目前为止,这已经缩小到以前的控制器视图中的一个问题,我在NSPredicate中使用NSArray,因为我无法让NSPredicate与NSMutableArray一起工作。所以现在这是试图解决的问题。
转换/分配NSArray作为NSMutableArray ......
答案 0 :(得分:5)
NSArrays是不可变的,这意味着您无法添加或删除元素,因此您的对象没有removeObjectAtIndex:
方法。
NSArray
而不是NSMutableArray
。NSMutableArray
。NSArray
,请先使用NSMutableArray
方法从中创建arrayWithArray:
。答案 1 :(得分:2)
首先你的主题数组是不可变的。对主题数组使用NSMutableArray类。
还尝试使用beginUpdates
- endUpdates
阻止...
[tv beginUpdates];
[tv deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tv endUpdates];
答案 2 :(得分:2)
正在生成错误,因为您的数据源始终必须与添加/删除的行保持一致,这意味着如果之前调用该方法:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
返回x,你删除了n行,然后在删除动画之后下一次调用方法必须返回(x-n)
此外,如果您使用NSArray
作为数据源,并且您将添加/删除行,那么它必须是不可变的,因为您必须保持您的数组与添加/删除一致。因此,您需要使用NSMutableArray
。