回到之前的 UIViewController 时 iOS App 崩溃
Posted
技术标签:
【中文标题】回到之前的 UIViewController 时 iOS App 崩溃【英文标题】:iOS App crash when it comes back to previous UIViewController 【发布时间】:2017-07-05 10:35:02 【问题描述】:我在这个问题 (link) 中描述了同样的问题,但在我的情况下,我使用 AVPlayerViewController
而不是 MPMoviePlayerController
,所以我尝试应用相同的答案逻辑,但 AVPlayer
只有unknow, readyToPlay 和 failed 状态,我不知道 Controller 何时关闭。如何知道 AVPlayerViewController
何时关闭或如何解决由方向引起的相同崩溃?
我的 ViewController 定位方法:
override var shouldAutorotate : Bool
return false
override var supportedInterfaceOrientations : UIInterfaceOrientationMask
return UIInterfaceOrientationMask.portrait
这是打开AVPlayerViewController
的方法:
func playVideo(at videoUrl: URL)
let controller = AVPlayerViewController()
controller.player = AVPlayer(playerItem: AVPlayerItem(url: videoUrl))
self.present(controller, animated: true, completion:
controller.player?.play()
)
更新:
崩溃日志:
Fatal Exception: UIApplicationInvalidInterfaceOrientation
0 CoreFoundation 0x183dc2fe0 __exceptionPreprocess
1 libobjc.A.dylib 0x182824538 objc_exception_throw
2 CoreFoundation 0x183dc2f28 -[NSException initWithCoder:]
3 UIKit 0x189fe7f78 -[UIViewController _preferredInterfaceOrientationForPresentationInWindow:fromInterfaceOrientation:]
4 UIKit 0x18a8c5b68 -[_UIFullscreenPresentationController _adjustOrientationIfNecessaryInWindow:forViewController:preservingViewController:]
5 UIKit 0x18a2421a4 -[UIPresentationController _dismissWithAnimationController:interactionController:target:didEndSelector:]
6 UIKit 0x18a2689a4 -[UIViewController _dismissViewControllerWithAnimationController:interactionController:completion:]
7 UIKit 0x18a01dc04 -[UIViewController _dismissViewControllerWithTransition:from:completion:]
8 UIKit 0x189fc5a98 -[UIViewController dismissViewControllerWithTransition:completion:]
9 UIKit 0x18a267c4c -[UIViewController _performCoordinatedPresentOrDismiss:animated:]
10 UIKit 0x189fc55ec -[UIViewController dismissViewControllerAnimated:completion:]
11 AVKit 0x191667f28 -[AVPlayerViewController(AVPlaybackControlsViewControllerActions) doneButtonTapped:]
12 AVKit 0x19168d614 -[AVPlaybackControlsViewController doneButtonTapped:]
13 UIKit 0x189f29010 -[UIApplication sendAction:to:from:forEvent:]
14 UIKit 0x189f28f90 -[UIControl sendAction:to:forEvent:]
15 UIKit 0x189f13504 -[UIControl _sendActionsForEvents:withEvent:]
16 UIKit 0x189f28874 -[UIControl touchesEnded:withEvent:]
17 UIKit 0x189f28390 -[UIWindow _sendTouchesForEvent:]
18 UIKit 0x189f23728 -[UIWindow sendEvent:]
19 UIKit 0x189ef433c -[UIApplication sendEvent:]
20 UIKit 0x18a6ee014 __dispatchPreprocessedEventFromEventQueue
21 UIKit 0x18a6e8770 __handleEventQueue
22 UIKit 0x18a6e8b9c __handleHIDEventFetcherDrain
23 CoreFoundation 0x183d7142c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
24 CoreFoundation 0x183d70d9c __CFRunLoopDoSources0
25 CoreFoundation 0x183d6e9a8 __CFRunLoopRun
26 CoreFoundation 0x183c9eda4 CFRunLoopRunSpecific
27 GraphicsServices 0x185708074 GSEventRunModal
28 UIKit 0x189f59058 UIApplicationMain
29 selftv 0x10006c124 main (AppDelegate.swift:15)
30 libdyld.dylib 0x182cad59c start
【问题讨论】:
我认为您在从 currentviewcontroller 消失时没有停止播放器。我想当你回到以前的视图控制器时停止播放器。 @AshokLondhe 崩溃说:致命异常:UIApplicationInvalidInterfaceOrientation 作为我链接的问题 您没有在问题中提及,请在链接中检查您的问题,我似乎没有。 @AshokLondhe 如果你小心点,你可以看到类似问题的链接,在我的问题结束时我说崩溃是由方向引起的 你还没有分享任何崩溃日志,你怎么能说崩溃是因为方向? 【参考方案1】:最佳解决方案是创建新的UIWindow
并将AVPlayerViewController
设置为rootViewController
并配置新窗口的方向。
当应用程序仅用于纵向时,我将此解决方案用于具有横向和纵向方向的图片库。
示例:
UIWindow *modalWindow = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
modalWindow.tag = kWindowTag;
modalWindow.rootViewController = <your player vc>;
[modalWindow makeKeyAndVisible];
但您需要在关闭AVPlayerViewController
后设置modalWindow.hidden = yes
并为上一个窗口调用makeKeyAndVisible
。
我使用#import <objc/runtime.h>
覆盖presentViewController:animated:completion:
和dismissViewControllerAnimated:completion:
,并在我的方法中实现了显示/关闭新窗口的逻辑。
如果您需要更多示例或解释,请告诉我。 谢谢
【讨论】:
斯威夫特 3:let modalWindow = UIWindow(frame: UIScreen.main.bounds) modalWindow.tag = kWindowTag modalWindow.rootViewController = <your player vc> modalWindow.makeKeyAndVisible()
明天我会把完整的例子发给你。
为什么将 shouldAutorotate 设置为 false? override var shouldAutorotate : Bool return false
你试过设置为真吗?
我用自定义 AVPlayerViewController 及其override var shouldAutorotate : Bool return true
解决了这个问题
完美。很好的解决方案。以上是关于回到之前的 UIViewController 时 iOS App 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
如何从 SKScene 回到 UIViewController (MenuVC)?