簡體   English   中英

iOS 應用程序進入黑屏

[英]iOS App Goes to Black Screen

我在我的 Swift 應用程序中使用了啟動屏幕故事板和主故事板。 有時應用程序會顯示啟動故事板,然后進入黑屏。 其他時候它正確地進入主故事板入口點。 幾乎看起來它是依賴於構建的,因為如果我清理和重建幾次,就會彈出一個運行正常的構建。 有什么想法可能導致這種情況嗎?

添加一些說明:

  • SplashScreen.storyboard 在目標設置中設置(好問題)。
  • 這在真實設備和模擬器中都會發生,但並非總是如此。
  • 在這個階段我沒有做任何網絡(同步或其他)
  • 停電似乎僅在轉換到一個特定視圖時發生
  • 視圖的 viewWillDisplay 等代碼即使在黑屏時也會執行,但不顯示任何 VISIBLE

這可能會有所幫助:我在有問題的視圖中輸入了以下代碼:

override func viewDidAppear(animated: Bool) {
    print(self.view.layer.bounds.width);
    print(self.view.layer.bounds.height);

}

當出現黑屏問題時,我得到 260 和 17。當視圖正確顯示時,我得到 320 和 568 的 5s(模擬器)尺寸。這對任何人都有幫助嗎?

我終於解決了這個問題。 經過數周的斗爭並嘗試了從撕掉我的所有代碼中的所有內容,事實證明,我在情節提要中的視圖的視圖出口已經與“視圖”和該視圖中的一個文本字段雙重鏈接。 像這樣:

在此處輸入圖像描述

我已經刪除了到文本字段的鏈接,但在這里顯示正確的鏈接:

在此處輸入圖像描述

有趣的是,我無法在 UI 中重現這種意外連接,所以我不確定這是怎么發生的。 無論如何,我希望這可以幫助其他可能遇到此問題的人。

我在我的設備中遇到了同樣的問題。 我設法通過 xcode 設置應用程序的主界面來修復它: MyApplicationMain InterfaceLaunchScreen.storyboard (或Main.storyboard )。

在此處輸入圖像描述

干杯! :)

我會說問題是這一行:

    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 ManifestScene ConfigurationApplication Session RoleItem 0 (Default Configuration)內的值數組中的Info.plist文件來解決此問題。

<key>UISceneStoryboardFile</key>
<string>Main</string>

默認情況下,上面的值實際上存在於Info.plist ,我之前不小心刪除了它。

對我來說,我的問題是我不小心刪除了 Info.plist 中的“Application Scene Manifest”,請確保它在那里!

我今天遇到了同樣的問題,調試了2小時后我得到了修復

有幾件事要記住。

  1. 故事板名稱應在以下區域相同
    • 目標>“主要目標”>常規>部署信息>主界面
    • 目標>“主要目標”>構建設置> UIKit主故事板文件基本名稱
    • Info.plist > Application Scene Manifest > Scene Configuration > Application Session Role > Item 0 > Storyboard Name
  2. 確保在您的故事板標識符下方,在您上面設置的故事板中的主/默認 ViewController 上選中“是初始視圖控制器”。
  3. 如果您已刪除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 系統,這就是我們從當前場景設置它的原因

  1. 現在您必須在AppDelegate中設置 sceneConfig 委托類

為此,請參考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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM