32

initWithNibName:bundle:在尝试使用或类似方法加载之前检查 Nib 或 Xib 文件是否存在的最佳方法是什么?

4

3 回答 3

68

#define AssertFileExists(path) NSAssert([[NSFileManager defaultManager] fileExistsAtPath:path], @"Cannot find the file: %@", path)
#define AssertNibExists(file_name_string) AssertFileExists([[NSBundle mainBundle] pathForResource:file_name_string ofType:@"nib"])

这是一组宏,您可以在尝试加载 a.xib或之前调用.nib它们,它们将有助于识别丢失的文件并吐出有关确切丢失内容的有用信息。

解决方案

目标-C

if([[NSBundle mainBundle] pathForResource:fileName ofType:@"nib"] != nil) 
{
    //file found
    ...
}

请注意,文档说明ofType:应该是文件的扩展名。然而,即使你使用 .xib,你也需要传递 `@"nib" 否则你会得到一个假阴性。

斯威夫特

guard Bundle.main.path(forResource: "FileName", ofType: "nib") != nil else {
       ...
    }

(参见:touti的原始答案:https ://stackoverflow.com/a/55919888/89035 )

于 2009-05-31T13:06:25.340 回答
3

快速解决方案:

guard Bundle.main.path(forResource: "FileName", ofType: "nib") != nil else {
   ...
}
于 2019-04-30T11:25:41.587 回答
0

我在这里看到两种解决方案。

您可以只调用 initWithNibName:bundle: 并在异常失败时捕获异常(我喜欢这个想法,感觉很健壮)。您可能想要验证该异常实际上是“找不到文件”异常,而不是“内存不足”异常。

或者,您可以先检查 nib 的存在,使用 NSBundle 的 pathForResource:ofType:,它为不存在的文件返回 nil。

于 2009-05-28T23:41:23.070 回答