Ios nsrange异常-索引(2008)超出范围(1)

Ios nsrange异常-索引(2008)超出范围(1),ios,objective-c,uitableview,magicalrecord,Ios,Objective C,Uitableview,Magicalrecord,我试图在从核心数据模型中删除UITableViewCell之前获取其内容,以便对其内容进行操作。如果核心数据模型中只有一个项,而我打算将其从UITableView中删除,则应用程序只会偶尔抛出2014-01-05 11:10:26.189个字节[43609:70b]***由于未捕获的异常“NSRangeException”终止应用程序,原因:'***-[\PFArray objectAtIndex::]:index(2008)超出范围(1)“ 我最大的困惑是,这只发生在UITableView中的

我试图在从核心数据模型中删除UITableViewCell之前获取其内容,以便对其内容进行操作。如果核心数据模型中只有一个项,而我打算将其从UITableView中删除,则应用程序只会偶尔抛出
2014-01-05 11:10:26.189个字节[43609:70b]***由于未捕获的异常“NSRangeException”终止应用程序,原因:'***-[\PFArray objectAtIndex::]:index(2008)超出范围(1)“

我最大的困惑是,这只发生在UITableView中的一个项目上,而不是100%发生。如果您需要查看任何其他代码,请告诉我

这是我正在使用的代码。粗体的一行是导致错误的一行,因为它从来不会通过该行将NSLog记录到控制台

// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        NSLog(@"Delete button pressed!");
        FoodListCell *cell = (FoodListCell*)[tableView cellForRowAtIndexPath:indexPath];
        NSLog(@"DEBUG | Selected Cell: %@", cell);

        NSString *foodOrActivity = cell.foodNameLabel.text;
        NSString *points = cell.foodPointsLabel.text;

        NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
        [[self.fetchedResultsController objectAtIndexPath:indexPath] MR_deleteInContext:localContext];
        [localContext MR_saveOnlySelfAndWait];

        NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row inSection:0];
        NSManagedObject *deleteObject = [_fetchedResultsController objectAtIndexPath:path];
        [managedObjectContext deleteObject:deleteObject];
    }
下面是完整的堆栈跟踪:

2014-01-05 11:10:26.189 Nibbles[43609:70b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[_PFArray objectAtIndex:]: index (2008) beyond bounds (1)'
*** First throw call stack:
(
    0   CoreFoundation                      0x01cd45e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x01a578b6 objc_exception_throw + 44
    2   CoreFoundation                      0x01cd43bb +[NSException raise:format:] + 139
    3   CoreData                            0x00280755 -[_PFArray objectAtIndex:] + 133
    4   CoreData                            0x002f9778 -[_PFMutableProxyArray objectAtIndex:] + 120
    5   CoreData                            0x00382c1f -[NSFetchedResultsController objectAtIndexPath:] + 255
    6   Nibbles                             0x0000660d -[FoodListViewController tableView:commitEditingStyle:forRowAtIndexPath:] + 685
    7   UIKit                               0x008b5ba3 -[UITableView animateDeletionOfRowWithCell:] + 107
    8   UIKit                               0x00a35695 -[UITableViewCell _swipeDeleteButtonPushed] + 70
    9   libobjc.A.dylib                     0x01a69874 -[NSObject performSelector:withObject:withObject:] + 77
    10  UIKit                               0x007c70c2 -[UIApplication sendAction:to:from:forEvent:] + 108
    11  UIKit                               0x007c704e -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
    12  UIKit                               0x008bf0c1 -[UIControl sendAction:to:forEvent:] + 66
    13  UIKit                               0x008bf484 -[UIControl _sendActionsForEvents:withEvent:] + 577
    14  UIKit                               0x008be733 -[UIControl touchesEnded:withEvent:] + 641
    15  UIKit                               0x00b39c7f _UIGestureRecognizerUpdate + 7166
    16  UIKit                               0x0080419a -[UIWindow _sendGesturesForEvent:] + 1291
    17  UIKit                               0x008050ba -[UIWindow sendEvent:] + 1030
    18  UIKit                               0x007d8e86 -[UIApplication sendEvent:] + 242
    19  UIKit                               0x007c318f _UIApplicationHandleEventQueue + 11421
    20  CoreFoundation                      0x01c5d83f __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 15
    21  CoreFoundation                      0x01c5d1cb __CFRunLoopDoSources0 + 235
    22  CoreFoundation                      0x01c7a29e __CFRunLoopRun + 910
    23  CoreFoundation                      0x01c79ac3 CFRunLoopRunSpecific + 467
    24  CoreFoundation                      0x01c798db CFRunLoopRunInMode + 123
    25  GraphicsServices                    0x0285e9e2 GSEventRunModal + 192
    26  GraphicsServices                    0x0285e809 GSEventRun + 104
    27  UIKit                               0x007c5d3b UIApplicationMain + 1225
    28  Nibbles                             0x000236ad main + 141
    29  libdyld.dylib                       0x031b470d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
在这里,您将获得节0中的行的索引路径并将其删除

您已经有了要删除的行/单元格/节的索引路径,为什么只在节0中删除该行


在此行尝试一个断点,并添加一些日志记录,以显示节0中的哪一行正在尝试删除

传统模式是访问模型(不是通过表格单元格,而是直接从模型中访问)。做任何你需要做的事情,然后从你的模型中删除它,然后从你的表中删除它

此错误表示此方法访问的localContext与报告模型中项目数的MOC不同(或处于不同的状态)(在
numberOfRowsInSection
:)中使用)


在继续记录或删除已删除对象的状态之前。修复获取该对象的代码并记录它。获取该对象的代码应该与在
单元格中获取该对象的代码完全匹配,并且在那里使用的MOC应该与
numberOfRowsInSection
:MOC完全匹配。

方法的其余部分很重要,因为错误来自
objectAtIndexPath
调用,未包含在您发布的代码中。@coneybeare不确定我怎么会错过它-将其余代码添加到函数中。正如@coneybeare所说,您缺少该方法中的代码,因为它正在抱怨NSFetchedResultsController对的调用objectAtIndexPath@valheru将剩余的NSFetchedResultsController代码添加到原始文章中。很抱歉跳过它。这是我的
numberofrowsinssection
code:
id sectionInfo=[[u fetchedResultsController sections]objectAtIndex:section];返回[sectionInfo numberOfObjects]是,因此在所有委托和数据源方法中都应该使用_fetchedResultsController来获取模型。我想我的另一个问题是,如果第二组代码使用
[managedObjectContext deleteObject:deleteObject]是否需要?我刚刚注释掉了@valheru在下面发布的三行代码,现在我的对象从模型和UITableView中删除了。@valhero是正确的,不需要构造indexPath。代码需要的代码被传递给了委托人,所以我试着把它改成这个,但它仍然抱怨——看起来代码来自上面的部分<代码>NSManagedObject*deleteObject=[\u fetchedResultsController对象索引路径:indexPath];[managedObjectContext deleteObject:deleteObject]啊,但是仔细看看。deleteObject实际上是从XPath的0部分分配的。不是原始的indexPath:NSIndexPath*path=[NSIndexPath indexPathForRow:indexPath.row安全设置:0];NSManagedObject*deleteObject=[\u fetchedResultsController对象索引路径:路径];在你看来,我需要两种方法吗?我注释掉了你发布的代码,现在删除发生了,对象从MOC中删除了。可能第二组代码超出了范围,因为对象已被删除。
NSIndexPath *path = [NSIndexPath indexPathForRow:indexPath.row inSection:0];
NSManagedObject *deleteObject = [_fetchedResultsController objectAtIndexPath:path];
[managedObjectContext deleteObject:deleteObject];