目录名称数组作为NSComboBox的数据源

时间:2009-09-23 12:18:58

标签: objective-c cocoa

我有一些问题需要检索文件夹名称并将它们作为ComboBox的项目发送

我的实际代码:

NSError *errors = nil;
NSString *pathForDirectory = @"/Folder/Folder/";
NSFileManager* fileManager = [NSFileManager defaultManager];
NSArray *contentsDirectory = [fileManager contentsOfDirectoryAtPath:
                             pathForDirectory error:&errors];
NSArray *Directory = [NSArray arrayWithObjects:contentsDirectory];

dataFromArray = [[NSMutableArray alloc] init];
[dataFromArray addObjectsFromArray:Directory];  

[self sortItemInMyComboBox:dataFromArray];

因此,如果使用静态数组定义NSArray *目录,它可以工作,但是使用上面的代码,应用程序崩溃并显示日志错误:由于未捕获的异常'NSRangeException'而终止应用程序,原因:' - [NSCFArray objectAtIndex:]:索引(2147483647(或可能更大))超出界限(3)'

我想,我的错误是我如何使用NSFileManager,但我已经尝试了其他方法成功。

提前致谢, 罗南。

1 个答案:

答案 0 :(得分:5)

问题

[NSArray arrayWithObjects:contentsDirectory];

解决方案(有关更好的解决方案,请参阅下文。)

[NSArray arrayWithArray:contentsDirectory];

原因

+ (NSArray *)arrayWithObjects:除了这样的未终止列表:

NSArray *fruits = [NSArray arrayWithObjects:@"Apple", @"Grape", @"Banana", nil];

如果找不到nil,它会尝试添加不存在的对象。这会导致出现丑陋的错误消息,不一定是您遇到的消息。


顺便说一句:

你的代码看起来太复杂了,它应该是这样的:

NSError *error = nil;
NSString *path = @"/Folder/Folder/";
NSFileManager* fileManager = [NSFileManager defaultManager];
NSArray *directory = [fileManager contentsOfDirectoryAtPath:pathForDirectory
                                                      error:&error];

if (error) {
    // do something about it
}

// You don't need autorelease if you use garbage collection
NSMutableArray *files = [[directory mutableCopy] autorelease];
// this looks like it violates the MVC pattern, have you
// thought about using bindings?
[self sortItemInMyComboBox:files];