#ios #swift #xcode #storyboard #uikit
#iOS #swift #xcode #раскадровка #uikit
Вопрос:
Всем привет,
Я создаю приложение Swift с использованием раскадровок. Я нормально работаю уже несколько месяцев, но внезапно мое приложение не загружается должным образом. Всякий раз, когда я открываю его на симуляторе или на своем физическом iPhone, экран запуска отображается до появления черного экрана.
Мой Mac находится на macOS Big Sur Developer Beta 5 с Xcode 12 Beta 6, а мой iPhone — на iOS 14 Developer Beta 5.
Это произошло внезапно, и я не помню, чтобы что-то делал, чтобы вызвать это.
Вот что я пробовал до сих пор…
- Переименование раскадровки и обновление вкладки «Общие» целевого объекта на новое имя, а также выполнение того же самого, но редактирование вручную Info.plist
- Перемещение раскадровки в «Копировать ресурсы пакета» и из него.
- Обновление до последней бета-версии Xcode 12 (я на macOS Big Sur)
- Очистка производных данных с помощью DevCleaner
- Запускаю совершенно новый проект и переношу весь свой код и ресурсы с помощью перетаскивания (Интересное наблюдение: когда я запускал новый проект, я добавил простую метку к Main.storyboard по умолчанию и запустил его на своем iPhone. Метка не отображалась.)
- Добавление функции в my AppDelegate для загрузки раскадровки вручную при запуске
- Добавление различных инструкций печати в AppDelegate и my Home View Controller
AppDelegate
Я добавил
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyboard.instantiateViewController(withIdentifier: "Home")
self.window.rootViewController = initialViewController
self.window.makeKeyAndVisible()
print("App launched")
в мой AppDelegate. Теперь, когда я запускаю свое приложение, я получаю
напечатано. Я также добавил
override func viewDidLoad() {
super.viewDidLoad()
print("Home view loaded")
к моему контроллеру домашнего просмотра.
Теперь, когда я запускаю свое приложение, я печатаю это в Xcode:
2020-08-28 13:11:20.140963 0100 MY-APP[11077:1951343] libMobileGestalt MobileGestaltCache.c:166: Cache loaded with 4536 pre-cached in CacheData and 53 items in CacheExtra.
2020-08-28 13:11:20.759943 0100 MY-APP[11077:1951162] Metal API Validation Enabled
Home view loaded
App launched
Тем не менее, на моем iPhone ничего нет. Появляется экран запуска, становится черным, и все. Я так запутался.
Если кто-нибудь знает, как это исправить, или что-то, что я могу попробовать, пожалуйста, дайте мне знать. Заранее благодарю вас!
Комментарии:
1. Удалось ли вам решить эту проблему?
2. @AshleyMills Вы, ребята, смогли найти решение этой проблемы?
3. Вы нашли какое-либо решение? Я также сталкиваюсь с той же проблемой.
Ответ №1:
Убедитесь, что подобное окно присутствует как в вашем sceneDelegate, так и в AppDelegate.
class AppDelegate: UIResponder, UIApplicationDelegate {
// check for this
var window: UIWindow?
// check for this
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
}
}
Ответ №2:
Если вы пока не хотите переключаться на Scene API, вы также можете просто установить UIApplicationSupportsMultipleScenes
значение NO
в UIApplicationSceneManifest
разделе, который, вероятно, недавно появился в вашем Info.plist. Это то, что я только что сделал, и это устранило проблему для меня.
Ответ №3:
В последней версии свойство window больше не доступно в AppDelegate. Теперь оно перемещено в SceneDelegate.swift . Вы можете попробовать сделать, как показано ниже, в функции scene willConnectTo:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let _ = (scene as? UIWindowScene) else { return }
if let windowScene = scene as? UIWindowScene {
self.window = UIWindow(windowScene: windowScene)
let storyBoard = UIStoryboard(name: "Main", bundle: nil)
let initialViewController = storyBoard.instantiateViewController(withIdentifier: "Home")
self.window?.rootViewController = initialViewController
self.window!.makeKeyAndVisible()
}
}
Обновление: также сделайте ваш основной интерфейс в разделе «Общее меню» пустым
Также вам необходимо удалить <key>UIMainStoryboardFile</key><string>Main</string>
и <key>UISceneStoryboardFile</key> <string>Main</string>
из вашего Info.plist
вашего проекта.
Комментарии:
1. Хммм, это ничего не дало… приложение по-прежнему запускается на черном экране.
2. Тогда может возникнуть другая проблема. Мы не можем видеть детали вашей раскадровки, как она организована. Однако, является ли основной интерфейс в целом пустым?
3. Нет, в главном интерфейсе выбран Main.storyboard. Я играл с этим, но все еще безуспешно… спасибо за вашу помощь.
4. Также вам необходимо удалить <key>UIMainStoryboardFile</key><string>Main</string> и <key>UISceneStoryboardFile</key> <string>Main</string> из вашего Info.plist вашего проекта.
Ответ №4:
Я также столкнулся с той же проблемой. В исходном вопросе говорится,
«Это произошло внезапно, и я не помню, чтобы что-то делал, чтобы вызвать это».
Это именно то, что случилось со мной, и ниже показано, как я решил проблему.
В Main.storyboard есть точка входа в приложение, которая визуально изображена в виде стрелки, указывающей на навигационный контроллер. Раз вопрос появился, я заметил, что эта стрелка как-то сейчас не хватает, и это начальный вид контроллера флажок в представлении контроллера разделе атрибут инспектора на вкладке инспектора области сейчас снят.
Проблема была решена, когда я установил упомянутый выше флажок Is Initial View Controller (стрелка в контроллере навигации раскадровки также появилась после проверки этого). Ниже приведено изображение xcode после решения проблемы, чтобы помочь лучше понять.
Это изображение, показывающее панель контроллера навигации и инспекторов после устранения проблемы.
Надеюсь, кто-нибудь найдет это полезным.