ios - Swift - 启动屏幕 SIGABRT 错误

标签 ios swift xcode swift3 runtime-error

我当前的 swift 项目遇到了一个真正的快速问题。本质上;我正在尝试实现教程的组合来为我的应用程序呈现动画启动屏幕;但是使用以下代码我收到错误“Thread 1:signal SIGABRT”,我似乎无法找出根本原因。我正在关注的示例项目使用的是 tableview,因为主屏幕是我们项目之间的唯一区别;但我无法在代码中找到负责证明我的错误的理由。错误位于以下某处,因为我的 viewController 的其余部分留空以尝试找到问题的根源。

这是错误所在的我的应用程序委托(delegate)文件 导入 UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?


        func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
            // Override point for customization after application launch.

            self.window = UIWindow(frame: UIScreen.main.bounds)
            self.window!.backgroundColor = UIColor(red: 241/255, green: 196/255, blue: 15/255, alpha: 1)
            self.window!.makeKeyAndVisible()

            // rootViewController from StoryBoard
            let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let navigationController = mainStoryboard.instantiateViewController(withIdentifier: "navigationController")
            self.window!.rootViewController = navigationController

            // logo mask
            navigationController.view.layer.mask = CALayer()
            navigationController.view.layer.mask!.contents = UIImage(named: "logo.png")!.cgImage
            navigationController.view.layer.mask!.bounds = CGRect(x: 0, y: 0, width: 60, height: 60)
            navigationController.view.layer.mask!.anchorPoint = CGPoint(x: 0.5, y: 0.5)
            navigationController.view.layer.mask!.position = CGPoint(x: navigationController.view.frame.width / 2, y: navigationController.view.frame.height / 2)

            // logo mask background view
            let maskBgView = UIView(frame: navigationController.view.frame)
            maskBgView.backgroundColor = UIColor.white
            navigationController.view.addSubview(maskBgView)
            navigationController.view.bringSubview(toFront: maskBgView)

            // logo mask animation
            let transformAnimation = CAKeyframeAnimation(keyPath: "bounds")
            transformAnimation.delegate = self as? CAAnimationDelegate
            transformAnimation.duration = 1
            transformAnimation.beginTime = CACurrentMediaTime() + 1 //add delay of 1 second
            let initalBounds = NSValue(cgRect: (navigationController.view.layer.mask!.bounds))
            let secondBounds = NSValue(cgRect: CGRect(x: 0, y: 0, width: 50, height: 50))
            let finalBounds = NSValue(cgRect: CGRect(x: 0, y: 0, width: 2000, height: 2000))
            transformAnimation.values = [initalBounds, secondBounds, finalBounds]
            transformAnimation.keyTimes = [0, 0.5, 1]
            transformAnimation.timingFunctions = [CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut), CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)]
            transformAnimation.isRemovedOnCompletion = false
            transformAnimation.fillMode = kCAFillModeForwards
            navigationController.view.layer.mask!.add(transformAnimation, forKey: "maskAnimation")

            // logo mask background view animation
            UIView.animate(withDuration: 0.1,
                           delay: 1.35,
                           options: UIViewAnimationOptions.curveEaseIn,
                           animations: {
                            maskBgView.alpha = 0.0
            },
                           completion: { finished in
                            maskBgView.removeFromSuperview()
            })

            // root view animation
            UIView.animate(withDuration: 0.25,
                           delay: 1.3,
                           options: UIViewAnimationOptions(),
                           animations: {
                            self.window!.rootViewController!.view.transform = CGAffineTransform(scaleX: 1.05, y: 1.05)
            },
                           completion: { finished in
                            UIView.animate(withDuration: 0.3,
                                           delay: 0.0,
                                           options: UIViewAnimationOptions(),
                                           animations: {
                                            self.window!.rootViewController!.view.transform = CGAffineTransform.identity
                            },
                                           completion: nil
                            )
            })

            return true

    }



    func applicationWillResignActive(_ application: UIApplication) {
        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.
    }

    func applicationDidEnterBackground(_ application: UIApplication) {
        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.
        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
    }

    func applicationWillEnterForeground(_ application: UIApplication) {
        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
    }

    func applicationWillTerminate(_ application: UIApplication) {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }


}

最佳答案

您的应用程序可能会在两个地方崩溃。

第一个崩溃可能性与从 Storyboard 实例化 UIViewController 有关。您可以尝试一些空白的 UIViewController,而不是从 Storyboard 实例化:

let navigationController = UIViewController()
self.window!.rootViewController = navigationController

如果它没有崩溃,则说明您的 Main.storyboard 存在一些问题。

第二个可能导致崩溃的地方:

navigationController.view.layer.mask!.contents = UIImage(named: "logo.png")!.cgImage

请确保您的图像没有问题并且存在于项目中。

此外,您可能需要重新考虑您对可选值展开的方法。使用:

navigationController.view.layer.mask?.contents = UIImage(named: "logo.png")?.cgImage

代替:

navigationController.view.layer.mask!.contents = UIImage(named: "logo.png")!.cgImage

编辑:

我发现了你的异常:

'NSInvalidArgumentException', reason: 'Storyboard () doesn't contain a view controller with identifier 'navigationController''

请确保为您的 navigationController 正确指定了 Storyboard ID

enter image description here

如果您需要提示如何捕获异常,请在评论中提问。

关于ios - Swift - 启动屏幕 SIGABRT 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43713286/

相关文章:

ios - 是否可以为 UIViewController 的标题设置 UILineBreakMode 或等效项?

iOS 如何在使用 AVAssetWriter 捕获视频时正确处理方向

ios - UICollectionView 单元格自动调整大小

ios - 从子类到父类的自定义委托(delegate)(subview-superview)

swift - WKWebKit 不刷新网页

ios - 保存图像以进行解析

iphone - id 没有警告?

objective-c - 对类实例的全局访问 - 最佳设计方法?

objective-c - 自动更新标签 Objective-C 无需点击按钮

ios - 由于错误 :,JSON 无法序列化