【问题标题】:iOS App Goes to Black ScreeniOS 应用程序进入黑屏
【发布时间】:2016-03-07 17:10:07
【问题描述】:

我在我的 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(模拟器)尺寸。这对任何人有帮助吗?

【问题讨论】:

  • Project Navigator,点击你的项目。然后点击Target(不是Project),向下滚动到App Icons and Launch Images。我怀疑你的问题在于你的Launch Screen File
  • 您的根控制器设置正确吗?您是否在您的代码中以编程方式更改根控制器?
  • 请出示您的代码。您是否在做任何违法的事情,例如在应用启动时同步联网?
  • @AdrianB 启动屏幕文件设置为正确的 LaunchScreen.storyboard。故事板正确显示,只是之后它变黑了。而且只是有时。
  • @TejaNandamuri 我不这么认为。我的根视图控制器正在使用 ViewController.swift 中的 viewWillAppear 中的一些代码。在其中,我正在检查该人是否已经注册了服务。如果有,我将它们发送(通过发送的 segue)到下一个视图。如果没有,我什么也不做,让注册屏幕显示(根视图)。

标签: ios swift storyboard xcode7


【解决方案1】:

我终于解决了这个问题。经过数周的斗争并尝试了从撕掉我的所有代码中的所有内容,事实证明,我在情节提要中的视图的视图出口已经与“视图”和该视图中的一个文本字段双重链接。像这样:

我已经删除了到文本字段的链接,但在这里显示正确的链接:

有趣的是,我无法在 UI 中重现这种意外连接,所以我不确定这是怎么发生的。无论如何,我希望这可以帮助其他可能遇到此问题的人。

【讨论】:

  • 我相信当我们复制粘贴整个视图时有时会发生这种情况......至少发生在我身上。
  • 这也可能是另一个原因。请查看我的回答stackoverflow.com/a/58217288/4131763
【解决方案2】:

我的设备也遇到了同样的问题。我设法通过xcode设置应用程序的主界面来修复它:MyApplicationMain InterfaceLaunchScreen.storyboard(或Main.storyboard)。

干杯! :)

【讨论】:

    【解决方案3】:

    我会说问题出在这一行:

        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 代码在这些实例中没有被执行。
    • 快速的事后报告。将对该函数的调用移至 viewDidAppear: 中,呈现的行为没有变化。这几乎就像重建过程有时会正确链接 post-splash 调用,而有时却没有。感谢您对此的持续思考。这已经困扰了我好几个星期了。
    • 我向您保证,这不是由于重建过程。这是关于你的代码
    • 我添加了代码来显示一个适当的典型的基于应用委托的策略,用于显示一次注册屏幕,这似乎是您正在尝试做的事情。
    • 我在 github 创建了一个可下载的项目,您可以检查它是否有效:github.com/mattneub/RegistrationExample
    【解决方案4】:

    确保您的第一个视图控制器(在我的情况下为导航控制器)是初始控制器。 Find more details here.

    另外,请确保在使用 Segue 连接初始控制器和第二个控制器时按“根视图控制器”关系 as you can see on picture here

    希望对你有帮助!

    【讨论】:

    • 我不小心选择了另一个视图控制器作为初始视图控制器,并意识到我的错误再次取消选中它(但从那一刻起,没有视图控制器是初始的!)。谢谢
    【解决方案5】:

    我通过将此属性值对添加到 Application Scene ManifestScene ConfigurationApplication Session RoleItem 0 (Default Configuration) 内的值数组中的 Info.plist 文件来解决此问题。

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

    上面的值实际上默认存在于Info.plist中,我之前不小心删除了它。

    【讨论】:

      【解决方案6】:

      我今天遇到了同样的问题,调试了 2 小时后我得到了修复

      有几点需要牢记。

      1. 故事板名称应在以下区域相同
        • 目标 > '主要目标' > 常规 > 部署信息 > 主界面
        • Targets > 'Main target' > Build Settings > UIKit Main Storyboard File Base Name
        • Info.plist > 应用场景清单 > 场景配置 > 应用会话角色 > 项目 0 > 故事板名称
      2. 确保在您的 Storyboard 标识符下方,在您上面设置的 Storyboard 中的主/默认 ViewController 上选中“Is Initial View Controller”。
      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
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-18
        • 2016-08-06
        • 1970-01-01
        • 1970-01-01
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-19
        相关资源
        最近更新 更多