删除行后删除 NSMutableArray returns 异常的对象
Removing object of NSMutableArray returns exception after row deleting
这是我的问题:
我有一个 NSMutableArray *notes
并且它是我 UITableView* _gradesTV
的来源。
我在此处添加了方法 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"%ld", (long)indexPath.section);
NSLog(@"%@", notes);
[_gradesTV beginUpdates];
[notes removeObjectAtIndex:indexPath.section];
[_gradesTV deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section]
withRowAnimation:UITableViewRowAnimationFade];
[_gradesTV endUpdates];
NSLog(@"%@", notes);
}
[_gradesTV reloadData];
}
但是当我删除一个元素时我得到这个错误:
*** Terminating app due to uncaught exception 'NSRangeException',
reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]'
但是我在 MutableArray 上创建的 NSLog 显示了 3 个元素...
注释(Mutable数组)上的removeObjectAtIndex
行使我的应用程序崩溃,就像执行了两次一样...
感谢您的帮助...
如果你想拉项目并尝试...
您必须使用 + 按钮创建成绩,然后您可以尝试删除我的 table 视图中的项目。
添加成绩时,第一个 TextField 是 string
,第二个是 double
值,第三个也是 double
值。
尝试使用以下代码..
- (NSInteger)numberOfSections {
return [notes count];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"%ld", (long)indexPath.section);
NSLog(@"%@", notes);
[notes removeObjectAtIndex:indexPath.section];
NSLog(@"%@", notes);
}
[_gradesTV reloadData];
}
首先删除UITableView's
beginUpdates
和endUpdates
其次删除UITableView's
reloadData
因为在使用UITableViewCellEditingStyleDelete
和UITableViewCellEditingStyleInsert
时不需要
现在您的代码将是:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"Current Section : %ld", (long)indexPath.section);
NSLog(@"Before : %@", notes);
[notes removeObjectAtIndex:indexPath.section];
// Either delete some rows within a section (leaving at least one) or the entire section.
id sectionDataSource = [notes objectAtIndex:indexPath.section];
if ([sectionDataSource count] > 0)
{
// Section is not yet empty, so delete only the current row.
[_gradesTV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
}
else
{
// Section is now completely empty, so delete the entire section.
[_gradesTV deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section]
withRowAnimation:UITableViewRowAnimationFade];
}
NSLog(@"After : %@", notes);
}
}
问题是您删除的是节而不是行。
[notes removeObjectAtIndex:indexPath.section];
应该是 [notes removeObjectAtIndex:indexPath.row];
另外[_gradesTV deleteSections
应该是[_gradesTV deleteRow...
注意: 你应该使用[_gradesTV deleteRow...
或[_gradesTV reloadData];
,因为两者都没有用.我会说只需使用 [_gradesTV deleteRow...
也不确定 beginUpdates
和 endUpdates
是为了什么。删除不需要的东西。
好吧,我知道我的错误是从哪里来的,只是我没有使用相同的 MutableArray 来获取部分的数量...
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return [notes count];
}
旧方法有一个旧的 NSMutableArray 我用来测试我的代码...
谢谢大家,虽然我太菜鸟了,自己没注意到....
这是我的问题:
我有一个 NSMutableArray *notes
并且它是我 UITableView* _gradesTV
的来源。
我在此处添加了方法 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"%ld", (long)indexPath.section);
NSLog(@"%@", notes);
[_gradesTV beginUpdates];
[notes removeObjectAtIndex:indexPath.section];
[_gradesTV deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section]
withRowAnimation:UITableViewRowAnimationFade];
[_gradesTV endUpdates];
NSLog(@"%@", notes);
}
[_gradesTV reloadData];
}
但是当我删除一个元素时我得到这个错误:
*** Terminating app due to uncaught exception 'NSRangeException',
reason: '*** -[__NSArrayM objectAtIndex:]: index 2 beyond bounds [0 .. 1]'
但是我在 MutableArray 上创建的 NSLog 显示了 3 个元素...
注释(Mutable数组)上的removeObjectAtIndex
行使我的应用程序崩溃,就像执行了两次一样...
感谢您的帮助...
如果你想拉项目并尝试...
您必须使用 + 按钮创建成绩,然后您可以尝试删除我的 table 视图中的项目。
添加成绩时,第一个 TextField 是 string
,第二个是 double
值,第三个也是 double
值。
尝试使用以下代码..
- (NSInteger)numberOfSections {
return [notes count];
}
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"%ld", (long)indexPath.section);
NSLog(@"%@", notes);
[notes removeObjectAtIndex:indexPath.section];
NSLog(@"%@", notes);
}
[_gradesTV reloadData];
}
首先删除UITableView's
beginUpdates
和endUpdates
其次删除UITableView's
reloadData
因为在使用UITableViewCellEditingStyleDelete
和UITableViewCellEditingStyleInsert
现在您的代码将是:
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
NSLog(@"Current Section : %ld", (long)indexPath.section);
NSLog(@"Before : %@", notes);
[notes removeObjectAtIndex:indexPath.section];
// Either delete some rows within a section (leaving at least one) or the entire section.
id sectionDataSource = [notes objectAtIndex:indexPath.section];
if ([sectionDataSource count] > 0)
{
// Section is not yet empty, so delete only the current row.
[_gradesTV deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]
withRowAnimation:UITableViewRowAnimationFade];
}
else
{
// Section is now completely empty, so delete the entire section.
[_gradesTV deleteSections:[NSIndexSet indexSetWithIndex:indexPath.section]
withRowAnimation:UITableViewRowAnimationFade];
}
NSLog(@"After : %@", notes);
}
}
问题是您删除的是节而不是行。
[notes removeObjectAtIndex:indexPath.section];
应该是 [notes removeObjectAtIndex:indexPath.row];
另外[_gradesTV deleteSections
应该是[_gradesTV deleteRow...
注意: 你应该使用[_gradesTV deleteRow...
或[_gradesTV reloadData];
,因为两者都没有用.我会说只需使用 [_gradesTV deleteRow...
也不确定 beginUpdates
和 endUpdates
是为了什么。删除不需要的东西。
好吧,我知道我的错误是从哪里来的,只是我没有使用相同的 MutableArray 来获取部分的数量...
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return [notes count];
}
旧方法有一个旧的 NSMutableArray 我用来测试我的代码...
谢谢大家,虽然我太菜鸟了,自己没注意到....