Ответ 1
Симулятор не чувствителен к регистру, но это устройство. Если ваш раскадровка называется MainStoryboard, а не MainStoryBoard, это вызовет вашу проблему.
Я начал новое приложение несколько дней назад и начал работать с симулятором, чтобы проверить его. Я начал как пустой проект и вручную добавил раскадровку. Симулятор строит и запускает мое приложение просто прекрасно, но когда я пытаюсь построить свой iPhone, я получаю сообщение "Не удалось найти раскадровку с именем" MainStoryBoard "в пакете NSBundle".
Google ничего не показал и этот вопрос предложил мне проверить свою цель для раскадровки, но все на месте. Тем не менее, если что-то не будет на месте, симулятор тоже не запустится.
Может ли кто-нибудь указать мне в правильном направлении?
Симулятор не чувствителен к регистру, но это устройство. Если ваш раскадровка называется MainStoryboard, а не MainStoryBoard, это вызовет вашу проблему.
У меня было приложение, работающее нормально на iPhone Simulator, но странно Xcode перестала отвечать, и мне пришлось заставить Quit Xcode. Когда я перезапустил Xcode, я столкнулся с "Не удалось найти раскадровку с именем MainStoryboard....",
Я исправил эту проблему, выполнив следующие шаги:
По какой-то причине файл "MainStoryboard.storyboard" не был распознан после того, как принудительно удалил Xcode и выполнил следующие шаги, после чего приложение распознало файл снова.
Надеюсь, что это решение поможет.
Просто хочу упомянуть сценарий, с которым я столкнулся. Я не знаю, как, но раскадровка отключилась от цели, хотя она все еще была частью проекта. Чтобы исправить это, я открыл раскадровку, выбрав "File Inspector" (самый левый значок на правой панели) и проверил проект в разделе "Целевое членство". Надеюсь, это поможет кому-то.
Проблема возникает, если вы отмените выбор "Использовать базовую интернационализацию" и запустите симулятор в разных локалях, а не в вашей конкретной локализации.
Например, вы указываете локализацию zh-CN в настройке проекта, но запускаете симулятор под en-US.
Я думал, что вы, возможно, удалили раскадровку и решили использовать файл .xib при первом запуске приложения. В этом случае Xcode попытается найти несуществующую раскадровку.
В этом случае щелкните Project > Info
> Custom iOS Target Properties
и удалите эту пару значений ключа:
Main storyboard file base name
Это помогло мне (Swift 2.1, Xcode 7.2) для приложения с панелью вкладок
let storyboard: UIStoryboard = UIStoryboard(name:"Main",bundle: NSBundle(forClass: self.dynamicType))
let tabController = storyboard.instantiateViewControllerWithIdentifier("MyTabBarIdentifier") as! UITabBarController
У меня была Main.storyboard с правильным целевым членством, копированием ресурсов пакета, очищенной папкой сборки и т.д. (большинство ответов указывало на это).
Простая чистка исправила ошибку для меня.
Нитин Алабур помог мне, но косвенно. Проводя другой ответ, чтобы уточнить:
Я создаю динамическую структуру с раскадровкой внутри нее, а в тестовом приложении, которое я создаю для проверки рамки, я получал эту ошибку.
Мой код выглядел так:
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil];
Я игнорировал материал NSBundle
, потому что, эй, я не знаю, что это за пакет. Оказывается, это важно для этого случая использования, где раскадровка будет существовать вне приложения "bundle" (вместо этого в моем пакете framework). Этот код скажет iOS найти раскадровку внутри пакета, в котором существует текущий класс (для меня это пакет, содержащий мою фреймворк):
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MyStoryboard" bundle:[NSBundle bundleForClass:[self class]]];
Пробовал все упомянутые выше решения, но не работал.
После тщательного исследования выяснилось, что виновник:
Скопируйте пакетный ресурс в TARGETS → Фазы сборки
Это было случайно удалено при удалении Cocoapods.
Ниже приведены шаги, чтобы исправить это:
TARGETS
вашего проектаplus (+) button
в верхнем левом углуStoryboard files (Main, Launchscreen etc).
Также добавьте папку "Активы".
Вы можете добавить эти файлы, нажав на кнопку плюс (+) внизу внизуderived data content
Delete the app
из Simulator/Device и снова запуститеПерейдите в свой проект, выберите свою цель и вытащите из меню, чтобы повторно выбрать раскадровки.
Кроме того, вы можете обновить свой plist, я обнаружил, что изменение одного не изменило другого.
Если вы используете для навигации по исходному коду, попробуйте использовать ниже код
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
Часто люди вводят "Main.storyboard" для имени, поскольку это буквально имя файла, но для целей кодирования Obj-C "X.storyboard" имеет имя "X", поэтому в этот случай, @ "Основной".
Чтобы этого не произошло, мне пришлось изменить способ работы с файлами раскадровки. После редактирования раскадровки сохраните файл, а затем выйдите из XCode. Это, по-видимому, предотвращает возникновение проблемы.
У меня была эта проблема, когда я случайно открыл проект со второй установкой Xcode. Он полностью разбил файлы моего проекта (что понятно).
Эта проблема возникла для меня, когда я вызывал раскадровку в коде. Причина в том, что я использовал другое слово для раскадровки. Я решил это как
Перейдите в "Цели" → информация, выберите информацию, скопируйте имя раскадровки и вставьте ее туда, где вы вызываете раскадровку.
По крайней мере, попробуйте...
Это случилось со мной, когда у меня было приложение с таким же именем, которое было установлено на симуляторе.
Я удалил предыдущее приложение, повторно выбрал раскадровку в "Информация о развертывании", перезапустил приложение, и все сработало нормально.
Вам просто нужно проверить конфигурационный файл (.plist
) в папке Supporting files
Проверьте имя раскадровки по умолчанию.
У меня также была такая же проблема, что вызвало такой тип исключения, я написал "Main.storyboard" вместо "Main". Нам не нужно указывать расширение .storyboard.
У меня была аналогичная проблема, и я получал следующую ошибку.
exception 'NSInvalidArgumentException', reason: 'Could not find a storyboard named 'MainStoryboard_iPhone' in bundle NSBundle
Я исправил его, обновив файл plist. Просто перейдите в Edit- > Find- > Find in Workspace и найдите "story". Теперь обновите соответствующее имя для панели рассказов.
Если вы недавно reset ваш симулятор iOS по умолчанию, также полезно проверить настройки локали в своих настройках. Я работаю над приложением с русским языком как единственной локалью, и после того, как sim reset xCode остановился, чтобы запустить приложение, потому что локаль сима была установлена на английский.
У меня была эта ошибка на устройстве, когда я добавил около 150 шрифтов на UIAppFonts
.
После того, как я уменьшил их количество до 100, он ушел.
У меня была эта проблема в проекте, в котором были раскадровки с и без ~ iPad или ~ суффиксов iPhone, например MainStoryboard.storyboard и MainStoryboard ~ iPad.storyboard.
Проблема заключалась в том, что MainStoryboard.storyboard переписывала MainStoryboard ~ iPad.storyboard, когда она скомпилировалась в каталог сборки. Если файлы были скомпилированы в обратном порядке, оба они будут сохранены без проблем. Я понятия не имею, почему это происходит.
Чтобы обойти это, вы можете прекратить использование суффиксов ~ iPad/iPhone или убедиться, что файлы находятся в правильном порядке на этапе копирования Bundle Resources.
(с использованием XCode6.2beta2)
Очень глупо, но у меня была "MainStoryboard.storyboard" в записи "Main baseboard file name (IPad)" основного моего файла .plist вместо "MainStoryboard".
Решение для меня состояло в том, что мне просто нужно было добавить MainStoryboard в Ресурсы Bundle. После этого он отлично работает.
Project → Build Phases → Copy Bundle Resources → нажмите кнопку + и добавьте файл.
Перейдите в свой info.plist на странице "Сборка фаз" > "Скопировать ресурсы пакета" и добавьте раскадровку с помощью значка "+"
В моем случае это была раскадровка внутри рамки для приложения Mac. Я использовал:
let storyboard = NSStoryboard(name: "StoryboardName", bundle: nil)
и необходимо использовать идентификатор пакета framework для получения правильного пакета:
let storyboard = NSStoryboard(name: "StoryboardName",
bundle: Bundle(identifier: "com.company.FrameworkName"))
Есть 2 возможности,
Select Storyboard > Go to file inspector (first right tab) > Check Target Membership
Инициализируйте раскадровку с правильным bundle
.
bundle = nil
Если раскадровка находится в разных целях, чем вы работаете, попробуйте выполнить следующий код для инициализации пакета и раскадровки.
let bundle = Bundle(for: MyClass.self)
let storyboard = UIStoryboard(name: "Main", bundle: bundle)