[英]iOS App Goes to Black Screen
我在我的 Swift 應用程序中使用了啟動屏幕故事板和主故事板。 有時應用程序會顯示啟動故事板,然后進入黑屏。 其他時候它正確地進入主故事板入口點。 幾乎看起來它是依賴於構建的,因為如果我清理和重建幾次,就會彈出一個運行正常的構建。 有什么想法可能導致這種情況嗎?
添加一些說明:
這可能會有所幫助:我在有問題的視圖中輸入了以下代碼:
override func viewDidAppear(animated: Bool) {
print(self.view.layer.bounds.width);
print(self.view.layer.bounds.height);
}
當出現黑屏問題時,我得到 260 和 17。當視圖正確顯示時,我得到 320 和 568 的 5s(模擬器)尺寸。這對任何人都有幫助嗎?
我會說問題是這一行:
dispatch_async(dispatch_get_main_queue(), {
self.performSegueWithIdentifier("toWelcomeView", sender: self);
});
您正在嘗試在該視圖尚未出現時對另一個視圖進行轉場(視圖將出現)。 這是非常不確定的,這就是為什么有時它實際上會失敗。 我有點驚訝您沒有報告在控制台中看到一條錯誤消息,警告您正試圖從視圖尚未出現在界面中的視圖控制器中分離出來。
作為一項臨時措施,您可以self.RetrieveRegistration()
的調用移至viewDidAppear:
中,看看是否有幫助。
但從長遠來看,你只是走錯了路。 您的目標似乎是在某些情況下啟動一個視圖控制器,而在其他情況下啟動另一個視圖控制器。 將所有這些邏輯放在前面的地方applicationDidFinishLaunching
,因此您的rootViewController
本身會根據情況而有所不同。
例如,想象以下非常簡單的情況:我們的故事板只包含兩個視圖控制器,RegistrationViewController 和 RootViewController(故事板標識符為"root"
),從第一個到第二個呈現連續。 在 RegistrationViewController 中,我們要求提供注冊信息,例如"username"
,我們將其放在 NSUserDefaults 中。 然后我們繼續到 RootViewController。 一切都很好,但我們的目標是用戶永遠不會再看到 RegistrationViewController 。 這在應用程序委托中很容易解決:
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
if let rvc = self.window?.rootViewController {
if NSUserDefaults.standardUserDefaults().objectForKey("username") as? String != nil {
self.window!.rootViewController = rvc.storyboard!.instantiateViewControllerWithIdentifier("root")
}
}
return true
}
確保您的第一個視圖控制器(在我的情況下為導航控制器)是初始控制器。 在此處查找更多詳細信息。
此外,請確保在使用 Segue 連接初始和第二個控制器時按“根視圖控制器”關系,如您在此處的圖片中看到的那樣。
我希望它有幫助!
我通過將此屬性-值對添加到Application Scene Manifest
→ Scene Configuration
→ Application Session Role
→ Item 0 (Default Configuration)
內的值數組中的Info.plist
文件來解決此問題。
<key>UISceneStoryboardFile</key>
<string>Main</string>
默認情況下,上面的值實際上存在於Info.plist
,我之前不小心刪除了它。
對我來說,我的問題是我不小心刪除了 Info.plist 中的“Application Scene Manifest”,請確保它在那里!
我今天遇到了同樣的問題,調試了2小時后我得到了修復
有幾件事要記住。
main.storyboard
並使用另一個故事板作為主界面或視圖層次結構調試器未顯示任何內容,則意味着您必須在SceneDelegate中手動將其設置為 root。為此,請參閱
SceneDelegate.swift
的以下代碼
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(windowScene: windowScene)
let sb = UIStoryboard(name: "HomeLanding", bundle: nil)
let vc = sb.instantiateViewController(withIdentifier: "HomeLandingVC")
window?.rootViewController = vc
window?.makeKeyAndVisible()
}
注意:設置window = UIWindow(frame: UIScreen.main.bounds)
會破壞 UISceneSession 系統,這就是我們從當前場景設置它的原因
為此,請參考
AppDelegate.swift
的以下代碼
func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
let config = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
config.delegateClass = SceneDelegate.self
return config
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.