Checking if a .nib or .xib file exists

£可爱£侵袭症+ 提交于 2019-11-27 12:49:27

问题


What's the best way to check if a Nib or Xib file exists before trying to load it using initWithNibName:bundle: or similar?


回答1:


Macro

#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"])

Here are a set of macros that you can call before you try an load a .xib or .nib, they will help identify missing files and spit out useful message about what exactly is missing.

Solutions

Objective-C:

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

Please note, the documentation states that ofType: should be the extension of the file. However even if you are using .xib you need to pass `@"nib" or you will get a false-negative.

Swift:

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

(See: touti's original answer: https://stackoverflow.com/a/55919888/89035)




回答2:


There are two solutions I see here.

You could just call initWithNibName:bundle: and catch an exception if it fails (I like this idea, it feels robust). You will probably want to verify that the exception is in fact a "file not found" exception rather than, say, an "out of memory" exception.

Alternatively, you could check the existence of the nib first, using NSBundle's pathForResource:ofType:, which returns nil for files that don't exist.




回答3:


Solution For swift :

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


来源:https://stackoverflow.com/questions/923706/checking-if-a-nib-or-xib-file-exists

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!