![](/img/trans.png)
[英]React Native - Storyboard as launch-screen not calling viewDidLoad
[英]Swift - launch-screen SIGABRT error
我目前的快速项目只是一个真正的快速问题。 实质上; 我正在尝试实施一系列教程,以为我的应用程序呈现动画启动屏幕; 但是,使用以下代码,我收到了错误“线程1:信号SIGABRT”,似乎无法找出根本原因。 我关注的示例项目使用的是表格视图,因为主屏幕显示的是我们项目之间的唯一区别; 但我无法在代码中找到证明我的错误的理由。 该错误驻留在下面的某个地方,因为我的viewController的其余部分都留为空白以尝试查找问题的根源。
这是错误所在的我的应用程序委托文件,导入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
有关。 不用从Storyboard实例化,您可以尝试一些空白的UIViewController
:
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”,原因:“ Storyboard()不包含标识符为“ navigationController”的视图控制器
请确保您已经为navigationController
正确指定了Storyboard ID
。
如果需要提示如何捕获异常,请在注释中提问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.