Подтвердить что ты не робот

Проверка наличия файла .nib или .xib.

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

4b9b3361

Ответ 1

макрос

#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, они помогут идентифицировать отсутствующие файлы и выложить полезное сообщение о том, что именно отсутствует.

Решения

Цель-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: fooobar.com/questions/241808/...)

Ответ 2

Есть два решения, которые я вижу здесь.

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

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

Ответ 3

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

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