-2

我已经搜索了许多这些NSRangeException错误线程,但似乎无法找到我的问题的答案。这是我的错误:

2015-08-15 17:28:43.793 UTK Recruiting[8794:254203] * 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“* -[__NSArrayI objectAtIndex:]:索引 3 超出范围 [0 .. 2]” *** 首先抛出调用堆栈:

这是一些代码。基本上,我正在浏览文档目录,获取所有文件名和路径,然后尝试填充UITableView文件名以便可以选择单元格,然后可以将该文件附加到电子邮件中。以下是我的一些代码:

解析文档目录,将所有 csv 文件放入相应的数组中。

- (void) refreshTable {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSArray *documentArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:documentsDirectory error:nil];

    NSArray *csvFiles = [documentArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(NSString *evaluatedObject, NSDictionary *bindings) {
        return [evaluatedObject hasSuffix:@".csv"];
    }]];

    self.csvFileNames = (NSMutableArray*) csvFiles;
    self.csvFilePaths = [NSMutableArray arrayWithCapacity:[csvFiles count]];

    for (NSString *fileName in csvFiles) {
        [self.csvFilePaths addObject:[documentsDirectory stringByAppendingPathComponent:fileName]];
    }



    NSLog(@"files array %@", _csvFileNames);
    NSLog(@"files array %@", _csvFilePaths);

这是 UITableView 代码:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    // Return the number of sections.
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    // Return the number of rows in the section.
    NSLog(@"count: %lu", (unsigned long)[self.csvFileNames count]);
    return [self.csvFileNames count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellforRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    cell.textLabel.text=[self.csvFileNames objectAtIndex:indexPath.row];

    return cell;
}

在我的代码中放置断点后,我发现它在cellForRowAtIndexPath方法中崩溃,这是我发布的代码中的最后一个方法。还有一点需要注意的是,有 4 个 csv 文件,并且[self.csvFileNames count]正确地给出了数字 4。

代码应该一直运行到索引 3,但我不知道为什么它不是。

  • thread #1: tid = 0x40646, 0x000000010de9f286 libsystem_kernel.dylib __pthread_kill __pthread_kill + 10, queue = 'com.apple.main-thread', stop reason = signal SIGABRT frame #0: 0x000000010de9f286 libsystem_kernel.dylib+ 10 frame #1: 0x000000010ded242f libsystem_pthread.dylib pthread_kill + 90 frame #2: 0x000000010dc3f19a libsystem_sim_c.dylibabort + 129 frame #3: 0x000000010da2a481 libc++abi.dylib abort_message + 257 frame #4: 0x000000010da523d5 libc++abi.dylibdefault_terminate_handler() + 267 frame #5: 0x0000000106aeae19 libobjc.A .dylib _objc_terminate() + 103 frame #6: 0x000000010da4fb01 libc++abi.dylibstd::__terminate(void (*)()) + 8 帧 #7: 0x000000010da4f7aa libc++abi.dylib __cxa_rethrow + 99 frame #8: 0x0000000106aead2c libobjc.A.dylibobjc_exception_rethrow + 40 帧 #9: 0x0000000106d7a41e CoreFoundation CFRunLoopRunSpecific + 654 frame #10: 0x0000000109b13a3e GraphicsServicesGSEventRunModal + 161 帧 #11: 0x000000010724a282c0 UIKit`UIApplicationMain +1
    • 帧 #12:0x000000010640211f UTK 招募main(argc=1, argv=0x00007fff598014f8) + 111 at main.m:14 frame #13: 0x000000010db97145 libdyld.dylib开始 + 1 帧 #14:0x000000010db97145 libdyld.dylib`start + 1

bt 所有崩溃报告:

  • thread #1: tid = 0x56469, 0x0000000109200286 >libsystem_kernel.dylib __pthread_kill __pthread_kill + 10, queue = 'com.apple.main-thread', stop >reason = signal SIGABRT frame #0: 0x0000000109200286 libsystem_kernel.dylib+ 10 frame #1: 0x000000010923342f libsystem_pthread.dylib pthread_kill + 90 frame #2: 0x0000000108fa019a libsystem_sim_c.dylibabort + 129 frame #3: 0x0000000108d8b481 libc++abi.dylib abort_message + 257 frame #4: 0x0000000108db33d5 libc++abi.dylibdefault_terminate_handler() + 267 frame #5: 0x0000000101e4be19 libobjc. A.dylib _objc_terminate() + 103 frame #6: 0x0000000108db0b01 libc++abi.dylibstd::__terminate(void (*)()) + 8 帧 #7: 0x0000000108db07aa libc++abi.dylib __cxa_rethrow + 99 frame #8: 0x0000000101e4bd2c libobjc.A.dylibobjc_exception_rethrow + 40 帧 #9: 0x00000001020db41e CoreFoundation CFRunLoopRunSpecific + 654 frame #10: 0x0000000104e74a3e GraphicsServicesGSEventRunModal + 161 帧 #11: 0x00000001025ab8c0 UIKit`Application +12

    • 帧 #12:0x000000010176311f UTK 招募main(argc=1, argv=0x00007fff5e4a04f8) + 111 at main.m:14 frame #13: 0x0000000108ef8145 libdyld.dylib开始 + 1 帧 #14:0x0000000108ef8145 libdyld.dylib`start + 1

    线程 #2: tid = 0x564a0, 0x0000000109201232 libsystem_kernel.dylib kevent64 + 10, queue = 'com.apple.libdispatch-manager' frame #0: 0x0000000109201232 libsystem_kernel.dylibkevent64 + 10 帧 #1: 0x0000000108eb376c libdispatch.dylib _dispatch_mgr_invoke + 247 frame #2: 0x0000000108eb3511 libdispatch.dylib_dispatch_mgr_thread + 54

    线程#3:tid = 0x564a2,0x000000010920094a libsystem_kernel.dylib __workq_kernreturn + 10 frame #0: 0x000000010920094a libsystem_kernel.dylib__workq_kernreturn + 10 帧#1:0x00000001092316c3 libsystem_pthread.dylib _pthread_wqthread + 869 frame #2: 0x000000010922f40d libsystem_pthread.dylibstart_wqthread + 13

    线程 #4: tid = 0x564a3, 0x000000010920094a libsystem_kernel.dylib __workq_kernreturn + 10 frame #0: 0x000000010920094a libsystem_kernel.dylib__workq_kernreturn + 10 帧 #1: 0x00000001092316c3 libsystem_pthread.dylib _pthread_wqthread + 869 frame #2: 0x000000010922f40d libsystem_pthread.dylibstart_wqthread + 13

    线程#5:tid = 0x564a4,0x000000010920094a libsystem_kernel.dylib __workq_kernreturn + 10 frame #0: 0x000000010920094a libsystem_kernel.dylib__workq_kernreturn + 10 帧#1:0x00000001092316c3 libsystem_pthread.dylib _pthread_wqthread + 869 frame #2: 0x000000010922f40d libsystem_pthread.dylibstart_wqthread + 13

    线程 #6: tid = 0x564a5, 0x000000010920094a libsystem_kernel.dylib __workq_kernreturn + 10 frame #0: 0x000000010920094a libsystem_kernel.dylib__workq_kernreturn + 10 帧 #1: 0x00000001092316c3 libsystem_pthread.dylib _pthread_wqthread + 869 frame #2: 0x000000010922f40d libsystem_pthread.dylibstart_wqthread + 13

4

2 回答 2

0

refreshTable似乎正在self.csvFilePaths正确构建数组,但是您的 cellForRowAtIndexPath 正在引用self.csvFileNames,我看不到填充的位置。

范围异常告诉您在self.csvFileNames.

为了让您的生活更轻松,请将“所有异常”断点添加到您的项目中。转到断点导航器(命令 7)。在底部,单击 + 并选择“添加异常断点”。当您的代码运行时,它会在异常被抛出之前中断。

于 2015-08-17T20:08:41.813 回答
0

更改您的 cellforRowAtIndexPath 方法:-

static NSString *CellIdentifier = @"Cell";

    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
    }
于 2015-08-16T01:42:22.533 回答