Каков наилучший способ проверить, существует ли файл Nib или Xib, прежде чем пытаться загрузить его с помощью initWithNibName:bundle:
или аналогичного?
Проверка наличия файла .nib или .xib.
Ответ 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 {
...
}