新手编程**
尝试从可变数组中访问对象时获取“超出边界”NSRangeException。该错误显示objectAtIndex的长数字,但该数组目前只有三个对象。
这是错误消息:由于未捕获的异常'NSRangeException'而终止应用程序,原因:' * - [__ NSArrayM objectAtIndex:]:索引2147483647超出边界[0 .. 2]'
我正在使用核心数据。
当我选择通过核心数据填充的tableview的第一行时,应用程序崩溃。
可变数组称为“allDates”。
似乎导致它的代码在这里的prepareForSegue方法中:
DateTableViewController.m的一部分
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NSString *segueIdentifier = [segue identifier];
if ([segueIdentifier isEqualToString:@"showDetails"])
{
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Date"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
self.allDates = [[context executeFetchRequest:fetchRequest error:nil] mutableCopy];
DateIdeaDetailViewController *vc = [segue destinationViewController];
NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow];
NSUInteger index = [allDates indexOfObject:selectedRowIndexPath];
//edited based on WilliamFalcon added "(int)"
_string = [NSMutableString stringWithFormat:@"%@", [allDates[(int)index] valueForKey:@"date_idea"]];
vc.dateIdeaLabelText = self.string;
}
}
DateTableViewController.h
#import <UIKit/UIKit.h>
#import "LifeBook.h"
#import "LifeBookAppDelegate.h"
#import "DateIdeaDetailViewController.h"
@interface DateTableViewController : UITableViewController
@property (strong, nonatomic) NSMutableArray *allDates;
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (weak, nonatomic) IBOutlet UITableViewCell *tableViewCell1;
@property (strong, nonatomic) NSMutableString *string;
@property (strong, nonatomic) NSString *label;
@end
如果这是一个愚蠢的问题,请告诉我。任何类型的资源都受到赞赏。
感谢您的帮助
答案 0 :(得分:2)
indexOfObject:
正在返回2147483647
的事实不是侥幸。 2147483647
相当于NSNotFound
相当于NSIntegerMax
,这是indexOfObject:
当您指定的对象不存在于数组中的任何索引时返回的值,或换句话说,“未找到”。
来自the docs
最低索引,其对应的数组值等于anObject。 如果数组中的所有对象都不等于anObject,则返回 NSNotFound。
这使我们了解您的应用崩溃的原因。您显然无法在大于小于数组计数的任何索引处访问数组中的元素,并且2147483647
是一个比数组计数大得多的数字,这会导致抛出范围异常。幸运的是,这个问题很容易解决,所有你需要做的就是当索引大于或等于数组的计数时,保护数组的访问权限。这是一个例子:
if (index < allDates.count) {
_string = [NSMutableString stringWithFormat:@"%@", [allDates[(int)index] valueForKey:@"date_idea"]];
vc.dateIdeaLabelText = self.string;
}else{
// do something else..
vs.dateIdeaLabelText = @"Something went wrong!";
}
答案 1 :(得分:1)
看起来你要求你的数组索引路径索引。我不认为这是一个索引路径数组......
你应该只做allDates [selectedRowIndexPath.row]。
还尝试将该行拆分为多个部分,以便您可以更好地进行调试。