我正在寻求帮助,以了解为什么我所遵循的教程不适合我。我正在运行macOS 12.3.1, Xcode 13.3.1。该项目是在Objective-C和使用XIB。这是一个基于视图的NSTableView,使用存储在我的SSD上的png文件夹用于imageView
和stringByDeletingPathExtension
作为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,以防万一你可能想看看它,看看是否有其他问题,但每个出口,委托,数据源都是连接的。现在说说我的诊断;想法:
- Debug 3标记是我发现最有趣的。AFAIK
file
应该仍然是(null)
,那么如何检查它是否等于directoryEnum.nextObject
返回YES
? - 我创建了Debug 3,因为检查是否进入循环的
NSLog
没有打印出来。因此我假设while
循环的条件有问题。 然后我尝试创建一个
do-while
循环而不是这个while
循环,当然,代码运行了。对于带有"映像文件路径"的日志它返回上面的地址,后面跟着(null)
,就好像它没有找到文件一样。但如果文件确实在那里,这怎么可能呢?我需要某种许可才能访问它吗?由于对象为空,控制台中的下一行非常清楚:"尝试从objects[1]中插入nil对象"。但是现在,我该如何解决这个问题呢?
非常感谢您的帮助。如果您从GitHub下载,请将*path
字符串替换为SSD上的png文件夹。
谢谢。
我认为您再也不能使用这样的路径直接访问文件系统了。如果在代码中检查file
的值,它是nil,这意味着file == directoryEnum.nextObject
将计算为true。
您必须创建一个以NSHomeDirectory()
或类似开头的路径,并向其中添加组件。这将创建一个通过应用程序支持文件夹的路径,该文件夹包含桌面的别名。我不确定为什么这是可以的,直接访问它是不行的,但我不是一个Mac开发人员。
我不得不说,跟随这么古老的教程,你会遇到很多问题。