【问题标题】:Array of directories names as data source for NSComboBox目录名称数组作为 NSComboBox 的数据源
【发布时间】:2009-09-24 00:39:36
【问题描述】:

我在检索文件夹名称并将它们作为 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 *Directory 是用静态数组定义的,它可以工作,但是使用上面的代码,应用程序崩溃并出现日志错误:由于未捕获的异常 'NSRangeException' 而终止应用程序,原因:' -[NSCFArray objectAtIndex:]:索引(2147483647(或可能更大))超出界限(3)'

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

提前致谢, 罗南。

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    问题

    [NSArray arrayWithObjects:contentsDirectory];
    

    解决方案(请参阅下文以获得更好的解决方案。)

    [NSArray arrayWithArray:contentsDirectory];
    

    原因

    + (NSArray *)arrayWithObjects: 不包括像这样的以 nil 结尾的列表:

    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];
    

    【讨论】:

    • +1 好答案。大多数代码更改都很好,但自动释放始终是正确的——GC 不会像在 Retain-Release 下那样将其添加到自动释放池中,但收集器可以将其用作提示。此外,为了覆盖最广泛的受众并能够使用任何第三方框架,最佳实践是编写在 RR 和 GC 下都可以工作的“双模式”代码。
    • GS:感谢您的更正。正如您所建议的,我使用了绑定,所以最终结果如下所示: ...NSMutableArray *files = [directory mutableCopy]; [dataFromArray addObjectsFromArray:files];其中 dataFromArray 是 NSComboxBox 出口。与主控制器绑定(模型键路径:self.dataFromArray)。然后工作。再次感谢。罗南。
    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多