我当前的 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
。
如果您需要提示如何捕获异常,请在评论中提问。
关于ios - Swift - 启动屏幕 SIGABRT 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43713286/