NSFileManager目录枚举器未运行时的While循环



我正在寻求帮助,以了解为什么我所遵循的教程不适合我。我正在运行macOS 12.3.1, Xcode 13.3.1。该项目是在Objective-C和使用XIB。这是一个基于视图的NSTableView,使用存储在我的SSD上的png文件夹用于imageViewstringByDeletingPathExtension作为stringValue用于单元格的文本字段。我用NSLog调用填充了我的代码,试图捕捉可能出错的地方。
大多数设置都发生在applicationDidFinishLaunching:中,其中我为表的内容初始化了NSMutableArray,为文件路径初始化了NSString,然后用所述路径设置了文件管理器和目录枚举器(注意:所有工作到这里)。
现在循环填充表内容的可变数组。我不明白为什么这个循环会被完全跳过!它的条件是设置一个NSString等于目录枚举器的nextObject。我确信循环被跳过,因为循环运行后的NSLog调用!
以下是applicationDidFinishLaunching:的完整代码,包括我的评论和日志(我刚刚用):

-(void)applicationDidFinishLaunching:(NSNotification *)aNotification {
_tableContents = [[NSMutableArray alloc] init];
NSString *path = @"/Users/<myUsername>/Developer/Apple-Programming-YT/Cocoa Programming/Flags/PNG/40x30";

// MARK: Debug 1
NSLog(@"path found: %@", path); // the correct path gets printed, as expected

NSFileManager *fileManager = [NSFileManager defaultManager];
NSDirectoryEnumerator *directoryEnum = [fileManager enumeratorAtPath:path];

NSString *file;
// MARK: Debug 2
NSLog(@"Checking that file is empty: %@", file); // (null) gets printed, as expected

// MARK: Debug 3
if (file != directoryEnum.nextObject) {
NSLog(@"File cannot be assigned to the Directory Enumerator");
} else if (file == directoryEnum.nextObject) {
NSLog(@"File properly assigned. Proceed!"); // this gets printed! Is it correct?
} else {
NSLog(@"Something went wrong during assignment of nextObject to file");
}

while (file = [directoryEnum nextObject]) {
NSLog(@"While loop entered!"); // this doesn't get printed! Why?!

// MARK: Debug 4
NSLog(@"File: %@", file);
NSString *filePath = [path stringByAppendingFormat:@"/%@", file];

// MARK: Debug 5
NSLog(@"Image filepath: %@", filePath);
NSDictionary *obj = @{@"image": [[NSImage alloc] initByReferencingFile:filePath],
@"name": [file stringByDeletingPathExtension]};
[self.tableContents addObject:obj];
}
[self.tableView reloadData];
NSLog(@"Table View Reloaded"); // This gets printed!
}

我已经将完整的应用程序上传到GitHub,以防万一你可能想看看它,看看是否有其他问题,但每个出口,委托,数据源都是连接的。现在说说我的诊断;想法:

  1. Debug 3标记是我发现最有趣的。AFAIKfile应该仍然是(null),那么如何检查它是否等于directoryEnum.nextObject返回YES?
  2. 我创建了Debug 3,因为检查是否进入循环的NSLog没有打印出来。因此我假设while循环的条件有问题。
  3. 然后我尝试创建一个do-while循环而不是这个while循环,当然,代码运行了。对于带有"映像文件路径"的日志它返回上面的地址,后面跟着(null),就好像它没有找到文件一样。但如果文件确实在那里,这怎么可能呢?我需要某种许可才能访问它吗?由于对象为空,控制台中的下一行非常清楚:"尝试从objects[1]中插入nil对象"。
    但是现在,我该如何解决这个问题呢?

非常感谢您的帮助。如果您从GitHub下载,请将*path字符串替换为SSD上的png文件夹。
谢谢。

我认为您再也不能使用这样的路径直接访问文件系统了。如果在代码中检查file的值,它是nil,这意味着file == directoryEnum.nextObject将计算为true。

您必须创建一个以NSHomeDirectory()或类似开头的路径,并向其中添加组件。这将创建一个通过应用程序支持文件夹的路径,该文件夹包含桌面的别名。我不确定为什么这是可以的,直接访问它是不行的,但我不是一个Mac开发人员。

我不得不说,跟随这么古老的教程,你会遇到很多问题。

相关内容

  • 没有找到相关文章

最新更新