Проверка, существует ли файл .nib или .xib - PullRequest
27 голосов
/ 29 мая 2009

Как лучше всего проверить, существует ли Nib-файл или Xib-файл, прежде чем загружать его, используя initWithNibName:bundle: или аналогичный?

Ответы [ 3 ]

62 голосов
/ 31 мая 2009

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

Вот набор макросов, которые вы можете вызвать, прежде чем пытаться загрузить .xib или .nib, они помогут идентифицировать отсутствующие файлы и выложить полезное сообщение о том, что именно отсутствует.

Решения

Objective-C :

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

Обратите внимание, в документации указано, что ofType: должно быть расширением файла. Однако даже если вы используете .xib, вам нужно передать `@" nib ", иначе вы получите ложноотрицательный результат.

Swift

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

(См .: touti оригинальный ответ: https://stackoverflow.com/a/55919888/89035)

0 голосов
/ 30 апреля 2019

Решение для Swift:

guard Bundle.main.path(forResource: "FileName", ofType: "nib") != nil else {
   ...
}
0 голосов
/ 29 мая 2009

Здесь я вижу два решения.

Вы можете просто вызвать initWithNibName: bundle: и перехватить исключение в случае сбоя (мне нравится эта идея, она кажется надежной). Возможно, вы захотите убедиться, что исключение на самом деле является исключением «файл не найден», а не, скажем, исключением «недостаточно памяти».

Кроме того, вы могли бы сначала проверить существование пера, используя pathForResource: ofType: NSBundle, который возвращает nil для файлов, которые не существуют.

...